浅谈flask-sqlalchemy和mysql的交互

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语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值