使用 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,多个数据库用法进行封装

Flask 进阶系列:SQLAlchemy 扩展学习

flask-sqlalchemy怎么用原生sql语句

Flask SQLAlchemy

text 使用Flask_SQLAlchemy连接到Azure SQL

从列表中过滤为查询字符串 postgresql flask sqlalchemy [重复]