web-dev-qa-db-ja.com

Flask= SQLAlchemyを使用したSQLiteからMySQLへの切り替え

Flask SQLAlchemyとSQLiteで構築したサイトがあり、MySQLに切り替える必要があります。データベース自体を移行し、MySQLで実行していますが、

  1. MySQLデータベースに接続する方法がわかりません(つまり、SQLALCHEMY_DATABASE_URIである必要があります)および
  2. 既存のSQLAlchemy SQLiteコードのいずれかがMySQLで動作するかどうかは不明です。

(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コードを移行できますか?

33
orome

あなたが指摘したチュートリアルは、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()

SQLAlchemymqsqldb)で使用されるデフォルトのドライバーが、仮想環境でコンパイルされないことがありました。そこで、完全な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コードを使用できるはずです。

66
skjoshi

受け入れられた答えはその時点では正しかったが、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になります。

1