Flask SQLAlchemyとSQLiteで構築したサイトがあり、MySQLに切り替える必要があります。データベース自体を移行し、MySQLで実行していますが、
SQLALCHEMY_DATABASE_URI
である必要があります)および(1)はかなり単純で、たとえば、MySQLデータベースツールで使用する接続ダイアログの内容を適切にフォーマットされたURLにマッピングする方法を示すだけの問題だと思います。しかし、私は心配しています(2)、SQLAlchemyが抽象化レイヤーを提供して、 単純なSQLAlchemyコードなど
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
admin = User('admin', '[email protected]')
db.session.add(admin)
User.query.all()
User.query.filter_by(username='admin').first()
データベースURIへの適切な変更以外の変更を行わずに作業します。しかし、MySQLでSQLAlchemyを使用するための 私が見つけた例 は、まったく異なるAPIを使用しているようです。
(2)データベースのURIを変更するだけで、MySQLデータベースで動作するようにFlask SQLAlchemyコードを移行できますか?
あなたが指摘したチュートリアルは、SQLAlchemyを使用してMySQLに接続する正しい方法を示しています。以下は、ごくわずかな変更を加えたコードです。
私の前提は、MySQLサーバーがFlaskが実行され、データベース名がdb_nameである同じマシンで実行されていることです。サーバーが同じマシンではない場合、サーバーIPをlocalhost
。
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '<User %r>' % self.username
admin = User('admin', '[email protected]')
db.create_all() # In case user table doesn't exists already. Else remove it.
db.session.add(admin)
db.session.commit() # This is needed to write the changes to database
User.query.all()
User.query.filter_by(username='admin').first()
SQLAlchemy
(mqsqldb
)で使用されるデフォルトのドライバーが、仮想環境でコンパイルされないことがありました。そこで、完全なpython implementation pymysql
を使用してMySQLドライバーを選択しました。pip install pymysql
、SQLALCHEMY_DATABASE_URIは次のように変更されます。
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
SQLAlchemyのようなORMを使用する目的は、ほとんどの場合、ほとんどまたはまったく変更せずに異なるデータベースを使用できることです。だから、私の答えはイエスです。上記のコードのようにマッピングされたURIでMySQLを操作するには、sqliteコードを使用できるはずです。
受け入れられた答えはその時点では正しかったが、importステートメントの構文は廃止されました。
この:
from flask.ext.sqlalchemy import SQLAlchemy
次のものに置き換える必要があります。
import flask_sqlalchemy
データベース接続に関する質問はトラフィックを獲得し、長期間関連性を保つ傾向があるため、記録しておく価値があります。
非推奨は Flask Version 1.0 Changelog にあります。これは例でこのモジュールを実際に使用しています。
flask.ext-拡張子をflask.ext名前空間からではなく、名前で直接インポートします。たとえば、import flask.ext.sqlalchemyはimport flask_sqlalchemyになります。