2015-01-04 12 views
22

Flask SQLAlchemyとSQLiteで構築したサイトがあり、MySQLに切り替える必要があります。私は自分自身を、データベースを移行して、それはMySQLの下で実行しているが、FlaskでSQLiteからMySQLに切り替えるSQLAlchemy

  1. MySQLデータベースに接続する方法を見つけ出すことはできません(つまり、SQLALCHEMY_DATABASE_URIはどうあるべきか)と、もしあれば
  2. アム不明確私の既存のSQLAlchemy SQLiteコードは、MySQLで動作します。

私は、(1)はかなり単純で、私のMySQLデータベースツールで使用する接続ダイアログの内容を適切にフォーマットされたURLにマップする方法を示していると思います。しかし、私は(2)、私はSQLAlchemyのは、データベースURIへの適切な変更以外の変更を加えることなくそのようsimple SQLAlchemy code such as

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() 

ウォールド作業を抽象化レイヤを提供することを想定していた心配です。 MySQLでSQLAlchemyを使用するためのexamples I've foundは全く異なるAPIを使用しているようです。

データベースのURIを変更するだけで、FlaskのSQLAlchemyコードをMySQLデータベースに移行できますか?もしそうなら、(1)そのURIはどのようにするべきですか?

+1

はい、ORMの全体のポイントはわからない、任意の違いを抽象化しています。そして確かにあなたがリンクしているそのブログは、uriが見えるべきものの完璧な例を持っていますか? –

+0

@DanielRoseman:例えば 'create_engine'の使用は、私が見たことではありません。 – orome

+0

しかし、これはデータベースの違いとは関係ありませんが、むしろFlaskがdb構成とスタンドアロンの方法を設定する方法です。 –

答えて

42

チュートリアルでは、SQLAlchemyを使用してMySQLに接続する正しい方法を示します。以下はあなたのコードです:

あなたのMySQLサーバは、Flaskが稼動しているマシンと同じマシン上で実行されており、データベース名はdb_nameです。ご使用のサーバーが同じマシンでない場合は、localhostの代わりにサーバーIPを入れます。

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:[email protected]/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の実装pymysqlでMySQLドライバを選んだ。あなたがpip install pymysqlを使用して、それをインストールすると、SQLALCHEMY_DATABASE_URIがに変わります。

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:[email protected]/db_name' 

SQLAlchemyのようにORMを使用する目的は、あなたがほとんどの場合、ほとんど、あるいは全く変化して別のデータベースを使用することができ、ということです。だから、私の答えは「はい」です。上記のコードのようにマッピングされたURIを使用してMySQLで動作するには、sqliteコードを使用できる必要があります。あなたがそう考える理由

関連する問題