使用Flask SQLAlchemy从SQLite切换到MySQL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Flask SQLAlchemy从SQLite切换到MySQL相关的知识,希望对你有一定的参考价值。
我有一个我用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的适当更改之外,没有任何修改的工作;但是使用SQLAlchemy和MySQL的examples I've found似乎使用完全不同的API。
我是否可以(2)通过简单地更改数据库URI来迁移我的Flask SQLAlchemy代码以使用MySQL数据库,如果是这样(1)该URI应该是什么?
您指出的教程显示了使用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。
当时接受的答案是正确的,但不推荐使用import语句中的语法。
这个:
from flask.ext.sqlalchemy import SQLAlchemy
应该替换为:
import flask_sqlalchemy
由于有关数据库连接的问题往往会获得流量并且长时间保持相关性,因此值得记录。
弃用是在Flask Version 1.0 Changelog中,它实际上在示例中使用此模块:
flask.ext - 直接通过名称而不是通过flask.ext命名空间导入扩展名。例如,import flask.ext.sqlalchemy变为导入flask_sqlalchemy。
以上是关于使用Flask SQLAlchemy从SQLite切换到MySQL的主要内容,如果未能解决你的问题,请参考以下文章
使用 Flask 中的 SQLAlchemy 会话会引发“在线程中创建的 SQLite 对象只能在同一线程中使用”
在Flask-SQLAlchemy中使用SQLite3时模拟布尔值的ARRAY
AttributeError:使用flask-sqlalchemy连接到sqlite数据库时无法设置属性