使用Flask SQLAlchemy从SQLite切换到MySQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Flask SQLAlchemy从SQLite切换到MySQL相关的知识,希望对你有一定的参考价值。

我有一个我用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的适当更改之外,没有任何修改的工作;但是使用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()

在我看来,SQLAlchemymqsqldb)使用的默认驱动程序在我的虚拟环境中不会为我编译。所以我选择了一个带有完整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数据库时无法设置属性

使用 flask_sqlalchemy 将 HTML 表单中的日期插入 SQlite 数据库

使用Flask_SQLAlchemy连接多个数据库

flask 使用 SQLAlchemy 的两种方式