flask-sqlalchemy
一个类似于django的orm框架的SQL对象关系映射工具,是flask使用最频繁的扩展之一,但是它不支持类似django的orm框架那样的数据迁移,映射。需要借助flask-script和flask-migrate,来完成一般的模型映射。具体步骤如下
注意:
之前咱们通过SQLAlchemy来创建表的时候,都是采用的db.create_all()
方法,这种方法有一个非常严重的问题,就是当我们需要添加或者删除数据库表中的字段的时候,直接修改Models里面的类是没有用的,必须要把数据库删除了,然后重新执行db.create_all()
方法,才会把我们修改的内容映射到数据库中,这在项目上线之后,数据库中已经存在数据了,如果要更新数据库了,这种方法是万万不可采用的,不可能把数据库删了,在重新新建,这时候咱们就需要对数据库进行迁移。flask_migrate可以通过命令把修改后的模型直接映射到数据库中而不用删除数据库。
# 安装软件
pip install flask-script
pip install flask-migrate
# 在目录上建立名为manage.py的文件
from flask_script import Manager # 可以让文件在命令行单独启动,用作数据库迁移操作
# 这里无法使用current_app的主要原因是,没有request请求上下文。
from main import app
from flask_migrate import Migrate, MigrateCommand # 用于数据库迁移
from common.models import db
from common.models.user import User, UserProfile, Relation
manager = Manager(app)
# 命令有 init初始化,migrate迁移数据,upgrade映射到数据库
# 1.使用flask_migrate必须绑定app和db
migrate = Migrate(app, db)
# 2.把MigrateCommand命令添加到manager上
manager.add_command('db', MigrateCommand)
# 命令行启动
if __name__ == '__main__':
manager.run()
# 启动命令如下,在命令行运行
初始化 python manage.py db init
数据迁移 python manage.py db migrate
映射到数据库 python manage.py db upgrade
这样就可以像django一样通过构建模型类改变数据库字段类型,这里的init只需要运行一次即可
对于数据要求较高的数据库,这个方法不适用,主要是数据模型类字段约束够导致的,以下是常见的模型字段和约束。
数据库的设置
在Flask中使用mysql数据库,需要安装一个flask-sqlalchemy的扩展
pip install flask-sqlalchemy
要连接mysql数据库,仍需要安装flask-mysqldb
pip install flask-mysqldb
Flask的数据库设置:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test3'</p>
常用的SQLAlchemy字段类型
类型名 python中类型 说明
Integer int 普通整数,一般是32位
SmallInteger int 取值范围小的整数,一般是16位
BigInteger int或long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 普通整数,一般是32位
String str 变长字符串
Text str 变长字符串,对较长或不限长度的字符串做了优化
Unicode unicode 变长Unicode字符串
UnicodeText unicode 变长Unicode字符串,对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 时间
Time datetime.datetime 日期和时间
LargeBinary str 二进制文件
常用的SQLAlchemy列选项
选项名 说明
primary_key 如果为True,代表表的主键
unique 如果为True,代表这列不允许出现重复的值
index 如果为True,为这列创建索引,提高查询效率
nullable 如果为True,允许有空值,如果为False,不允许有空值
default 为这列定义默认值
常用的SQLAlchemy关系选项
选项名 说明
backref 在关系的另一模型中添加反向引用
primary join 明确指定两个模型之间使用的联结条件
uselist 如果为False,不使用列表,而使用标量值
order_by 指定关系中记录的排序方式
secondary 指定多对多中记录的排序方式
secondary join 在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件
我们在开发过程中考虑到数据库优化问题,都会选择先写SQL语句,创建表,在进行模型映射。这样的好处是可以精确的把握每一个字段,以及使用的引擎,比如模型字段string只可以设置varchar无法设置char等等,再有对于事务的支持mysql默认使用InnoDB,对于不需要事务的表格使用MyISAM更好。写SQL语句可以自己选择表的引擎以及字段,约束等。然后在通过模型构建一些外键约束。
这里为了方便写SQL语句,有很多使用的工具可以使用,比如mysql官网自带的Mysql Workbench可以很好的创建SQL语句。