2015-01-04 100 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() 

沃爾德工作;但使用SQLAlchemy和MySQL的examples I've found似乎使用完全不同的API。

我可以(2)通過簡單地更改數據庫URI來遷移我的Flask SQLAlchemy代碼以使用MySQL數據庫,如果是這樣的話(1)該URI應該是什麼?

+1

是的,一個orm的全部觀點是要抽象出任何差異,不知道爲什麼你會這麼想。當然,你鏈接到的博客有一個完美的例子,你看到的應該是什麼? – 2015-01-04 15:11:13

+0

@DanielRoseman:例如'create_engine'的使用不是我見過的。 – orome 2015-01-04 15:14:29

+0

但這與數據庫之間的差異無關,而是Flask設置數據庫配置與獨立方法的方式。 – 2015-01-04 15:20:10

回答

42

您指出的教程展示了使用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:[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' 

使用ORM像的SQLAlchemy的目的是,可以使用不同的數據庫,在大多數情況下,幾乎沒有變化。所以,我的回答是肯定的。你應該可以使用你的sqlite代碼來處理MySQL,並使用上面代碼中映射的URI。