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

  1. 不知道如何连接到MySQL数据库(即SQLALCHEMY_DATABASE_URI应该是什么)和
  2. 我不清楚我现有的SQLAlchemy SQLite代码是否可以与MySQL一起使用.

我认为(1)相当简单,只是演示如何将我在MySQL数据库工具中使用的连接对话框的内容映射到适当格式的URL.但我担心(2),我假设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()

wold在不进行任何修改的情况下工作,除了对数据库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)使用的默认驱动程序没有在虚拟环境中为我编译.所以我 Select 了一个带有完整python实现的MySQL驱动程序.使用pip install pymysql安装后,SQLALCHEMY_数据库_URI将更改为:

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

使用类似ORM的SQLAlchemy的目的是,在大多数情况下,您可以使用不同的数据库,而几乎不需要更改.所以,我的答案是肯定的.您应该能够使用sqlite代码与MySQL一起工作,URI映射如上述代码所示.

Mysql相关问答推荐

如何在SQLAchemy for MYSQL中将字面量转换为表达?

SQL查询仅插入5行

MariaDB字段+1

使用由其中一个表的列规定的条件连接两个表

根据当前表列的值,从SQL中的另一个表中获取数据

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

如何计算具有权重属性的记录数

SQL使用LIMIT获取结果和结果中的行数

最后一个字母 '%n' 的 mysql SELECT 字符串不起作用

mysql insert into select join - 通过连接表将值从一列复制到另一表

在 SQL 中的 case 语句之后将新列转换为 INT

查询mysql中无法识别数据值

是否可以在一个查询中将字符串附加到许多匹配的行

为什么从我的 SQL 查询中删除 BINARY 函数调用会如此显着地改变查询计划?

按长度过滤 varbinary 字段

MySQL:如何多次加入同一张表?

是否可以在内部连接期间重命名连接列?

应该使用什么列类型将序列化数据存储在 mysql 数据库中?

Python 是否支持 MySQL 准备好的语句?