一尘不染

使用Flask SQLAlchemy从SQLite切换到MySQL

mysql

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

  1. 无法弄清楚如何连接到MySQL数据库(即SQLALCHEMY_DATABASE_URI应该是什么),并且
  2. 目前尚不清楚我现有的SQLAlchemy SQLite代码是否可以与MySQL一起使用。

我怀疑(1)相当简单,只是显示了如何将我在MySQL数据库工具中使用的连接对话框的内容映射到适当格式的URL。但是我担心(2),我假设SQLAlchemy提供了一个抽象层,因此简单的SQLAlchemy代码(例如

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结合使用的示例似乎使用了完全不同的API。

我是否可以(2)通过简单地更改数据库URI来迁移我的Flask SQLAlchemy代码以与MySQL数据库一起使用,如果可以的话(1)该URI应该是什么?


阅读 338

收藏
2020-05-17

共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()

我偶然发现SQLAlchemymqsqldb)使用的默认驱动程序在我的虚拟环境中没有为我编译。因此,我选择了具有完整python实现的MySQL驱动程序pymysql。使用安装后pip install pymysql,SQLALCHEMY_DATABASE_URI将更改为:

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

使用像SQLAlchemy这样的ORM的目的是,在大多数情况下,您可以使用几乎没有变化的其他数据库。所以,我的回答是。您应该能够使用sqlite代码将MySQL与上面的代码中映射的URI一起使用。

2020-05-17