使用 Flask SQLAlchemy 从 SQLite 切换到 MySQL
Posted
技术标签:
【中文标题】使用 Flask SQLAlchemy 从 SQLite 切换到 MySQL【英文标题】:Switching from SQLite to MySQL with Flask SQLAlchemy 【发布时间】:2015-01-04 14:59:22 【问题描述】:我有一个使用 Flask SQLAlchemy 和 SQLite 构建的网站,需要切换到 mysql。我已经迁移了数据库本身并让它在 MySQL 下运行,但是
-
不知道如何连接到 MySQL 数据库(也就是说,
SQLALCHEMY_DATABASE_URI
应该是什么)并且
不清楚我现有的任何 SQLAlchemy SQLite 代码是否适用于 MySQL。
我怀疑 (1) 相当简单,只是显示如何将我在 MySQL 数据库工具中使用的连接对话框的内容映射到适当格式的 URL。但我担心(2),我曾假设 SQLAlchemy 提供了一个抽象层,因此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', 'admin@example.com')
db.session.add(admin)
User.query.all()
User.query.filter_by(username='admin').first()
除了对数据库 URI 进行适当更改外,无需任何修改即可工作;但是examples I've found 使用 SQLAlchemy 和 MySQL 似乎使用了完全不同的 API。
我可以 (2) 迁移我的 Flask SQLAlchemy 代码以通过简单地更改数据库 URI 来使用 MySQL 数据库吗?如果可以 (1) 该 URI 应该是什么?
【问题讨论】:
@DanielRoseman:例如,create_engine
的使用不是我见过的。
但这与数据库之间的差异无关,而是 Flask 设置数据库配置的方式与独立方法的方式。
@DanielRoseman:啊,好消息! (我是 Flask 和 SQLAlchemy 的新手。)
@DanielRoseman:我也不清楚如何构建 URI。 (例如,在 URI 中输入密码对我来说感觉很奇怪;而且我不确定要提供什么服务器。)
为什么很奇怪?那么the documentation for the URI format 让你感到困惑呢?
【参考方案1】:
您指出的教程显示了使用 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', '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实现pymysql
的MySQL驱动程序。使用pip install pymysql
安装后,SQLALCHEMY_DATABASE_URI 将更改为:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
使用像 SQLAlchemy 这样的 ORM 的目的是,在大多数情况下,您可以使用不同的数据库而几乎没有变化。所以,我的答案是肯定的。您应该能够使用您的 sqlite 代码与 MySQL 一起使用如上述代码映射的 URI。
【讨论】:
由于某些原因,我的连接被拒绝。我确保 mysql 的用户名和密码是正确的。令人担忧的是,您的方法在我的机器上本地为我工作,但是当我在 Degital Ocean 中构建一个液滴进行部署时,它不起作用,我被拒绝连接。 Mysql 已正确安装,我可以成功登录,但从烧瓶没有 idk 为什么!有什么帮助吗? 烧瓶应用程序和数据库是否在同一个液滴上?如果不是,您可能想检查您是否可以远程访问数据库。此外,上面的示例假设允许用户名@localhost 访问。有 username@% 允许该用户从任何地方访问数据库。 我通过在路径中包含 ...mysqlId/mysql.sock 使其工作。 ;) 我花了两天时间在 AWS Lambda 中使用 Mysqldb 配置这个,错误,“ImportError: libmysqlclient.so.20: cannot open shared object file: No such file or directory”,但用 pymysql 替换它解决了问题。【参考方案2】:当时接受的答案是正确的,但 import 语句中的语法已被弃用。
这个:
from flask.ext.sqlalchemy import SQLAlchemy
应替换为:
import flask_sqlalchemy
由于有关数据库连接的问题往往会获得流量并长期保持相关性,因此值得记录在案。
弃用在Flask Version 1.0 Changelog中,在示例中实际使用了这个模块:
flask.ext - 直接按名称导入扩展,而不是 通过 flask.ext 命名空间。例如,导入 flask.ext.sqlalchemy 变成 import flask_sqlalchemy。
【讨论】:
访问数据库、sqlalchemy或通过flask中的其他包直接访问mysql哪个是最好的方法以上是关于使用 Flask SQLAlchemy 从 SQLite 切换到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章
Flask(flask_sqlalchemy)使用原生sql,多个数据库用法进行封装