我有一个使用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', 'admin@example.com') db.session.add(admin) User.query.all() User.query.filter_by(username='admin').first()
除了对数据库URI进行适当的更改外,无需进行任何修改即可进行工作;但是我发现将SQLAlchemy与MySQL结合使用的示例似乎使用了完全不同的API。
我是否可以(2)通过简单地更改数据库URI来迁移我的Flask SQLAlchemy代码以与MySQL数据库一起使用,如果可以的话(1)该URI应该是什么?
您所指向的教程显示了使用SQLAlchemy连接MySQL的正确方法。以下是您的代码,几乎没有更改:
我的假设是您的MySQL服务器在运行Flask的同一台计算机上运行,并且数据库名称为db_name。如果您的服务器不是同一台机器,请将服务器IP替换为localhost。
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', 'admin@example.com') 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实现的MySQL驱动程序pymysql。使用安装后pip install pymysql,SQLALCHEMY_DATABASE_URI将更改为:
SQLAlchemy
mqsqldb
pymysql
pip install pymysql
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
使用像SQLAlchemy这样的ORM的目的是,在大多数情况下,您可以使用几乎没有变化的其他数据库。所以,我的回答是。您应该能够使用sqlite代码将MySQL与上面的代码中映射的URI一起使用。