使用 Flask SQLAlchemy 从 SQLite 切换到 MySQL

Switching from SQLite to MySQL with Flask SQLAlchemy

我有一个用 Flask SQLAlchemy 和 SQLite 构建的站点,需要切换到 MySQL。我已经迁移了数据库本身并让它在 MySQL 下运行,但是

  1. 无法弄清楚如何连接到 MySQL 数据库(也就是说,SQLALCHEMY_DATABASE_URI 应该是什么)和
  2. 不清楚我现有的任何 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) 可以通过简单地更改数据库 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) 使用的默认驱动程序没有在我的虚拟环境中为我编译。所以我选择了一个 MySQL 驱动程序,它具有完整的 python 实现 pymysql。使用 pip install pymysql 安装后,SQLALCHEMY_DATABASE_URI 将更改为:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'

像SQLAlchemy一样使用ORM的目的是,在大多数情况下,您可以使用不同的数据库,只需很少或无需更改。所以,我的回答是肯定的。您应该能够使用您的 sqlite 代码来处理 MySQL 以及上面代码中映射的 URI。

当时接受的答案是正确的,但导入语句中的语法已被弃用。

这个:

from flask.ext.sqlalchemy import SQLAlchemy

应替换为:

import flask_sqlalchemy

由于有关数据库连接的问题往往会产生流量并长时间保持相关性,因此值得记录下来。

弃用在 Flask Version 1.0 Changelog 中,它在示例中实际使用了这个模块:

flask.ext - import extensions directly by their name instead of through the flask.ext namespace. For example, import flask.ext.sqlalchemy becomes import flask_sqlalchemy.