|Flask Web开发-数据库操作

Posted 多德伟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了|Flask Web开发-数据库操作相关的知识,希望对你有一定的参考价值。

你不一定要点蓝字关注我的


写在前面

从前有一个人身高2米7,过高的身高给他带来了苦恼。

女巫告诉他:“在森林的另一边有一只青蛙,你去向它求婚,它拒绝你一次你的身高就会缩短30厘米。“

于是男人踏上了穿越森林之路。果然,他看到了一只青蛙,于是他跪下问青蛙:“你愿意嫁给我吗?”

青蛙拒绝道:“不!”

神奇的事情发生了,这个人的身高果真缩短了30厘米,变成了2米4。

他决定再向青蛙求婚一次,于是他又问了青蛙一次:“你愿意嫁给我吗?”

青蛙说:“不!”

男人的身高变成了2米1。

然后他想“再求婚最后一次,1米8的身高最完美。”

于是,他最后一次跪下问青蛙:“你愿意嫁给我吗?”

青蛙生气了,不耐烦地喊道:“跟你说了多少次了,不!不!不!不!不!不!”



5.8数据库操作


5.8.1创建表

首先,我们要让Flask-SQLAlchemy根据模型类创建数据库。


方法是db.create_all()函数:

From hello import db

Db.creat_all()


如果你查看程序目录,会发现新建了一个名为data.sqlite的文件。这个SQLite数据库文件的名字就是在配置中指定的。如果数据库表已经存在于数据库中,那么db.create_all()不会重新创建或者更新这个表。更新现有数据库表的方式是先删除旧表再重新创建。

Db.drop_all()

Db.create_all()


5.8.2插入行

From hello import Role, User

Admin_role = Role(name = “Admin”)

Mod_role = Role(name = “Moderator”)

User_role = Role(name = “User”)

User_john = User(username = “john”, role = admin_role)

User_susan = User(username = “susan”, role = user_role)

User_david = User(username = “david”, role = user_role)


模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。注意,role属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。这些新建对象的id属性并没有明确设定,因为主键是由Flask-SQLAlchemy管理的。

通过数据库会话管理对数据库所做的改动,在Flask-SQLAchemy中,会话由db.session表示。调用commit()方法提交会话,就可以实现对对象的id赋值。数据库会话又被称为事务。


数据库会话能保证数据库的一致性。提交操作使用原子方式把会话中的对象全部写入数据库。如果在写入会话的过程中发生了错误,整个会话都会失效。如果你始终把相关改动放在会话里提交,就能避免因部分更新导致的数据库不一致性。


数据库回话也可回滚。调用db.session.rollback()后,添加到数据库会话中的所有对象都会还原到它们在数据库时的状态。


5.8.3修改行

在数据库会话上调用add()方法也能更新模型。

Admin_role.name = “Administrator“

Db.session.add(admin_min)

Db.session.commit()


5.8.4删除行

数据库会话中还有个delete()方法。

Db.session.delete(mod_role)

Db.session.commit()

注意:删除与插入和更新一样,提交数据库会话后才会执行。


5.8.5查询行

Flask-SQLAlchemy为每个模型都提供了query对象。使用过滤器可以配置query对象进行更精确的数据库查询。如果你退出了shell会话,前面这些例子中创建的对象就不会以python对象的形式存在,而是作为各自数据库表中的行。如果你打开一个新的shell会话,就要从数据库中读取行,再重新创建Python对象。


常用的SQLAlchemy查询过滤器

把过滤器添加到原查询上,返回一个新查询;把等值过滤器添加到原查询上,返回一个新查询;使用指定的值限制原查询返回的结果数量,返回一个新查询;偏移原查询返回的结果,返回一个新查询;根据指定条件对原查询结果进行排序,返回一个新查询;根据指定条件对原查询结果进行分组,返回一个新查询。


最常使用的SQLAlchemy查询执行函数

All():以列表的形式返回查询的所有结果;first():返回查询的第一个结果,如果没有结果,则返回None;first_or_404():返回查询的第一个结果,如果没有结果,则终止请求,返回404错误响应;get():返回指定主键对应的行,如果没有对应的行,则返回None;get_or_404():返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回404错误响应;count():返回查询结果的数量;paginate():返回一个Paginate对象,它包含指定范围内的结果。


这个例子中的user_role.users查询有个小问题。执行user_role.users表达式时,隐含的查询会调用all()返回一个用户列表。Query对象是隐藏的,因此无法指定更精确的查询过滤器。


5.9在视图函数中操作数据库

(五)|Flask Web开发-数据库操作

在这个修改的版本后,提交表单后,程序会使用filter_by()查询过滤器在数据库中查找提交的名字。变量known被写入用户会话中,因此重定向之后,可以把数据传给模板,用来显示自定义的欢迎消息。

(五)|Flask Web开发-数据库操作

5.11使用Flask-Migrate实现数据库迁移


在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库。

更新表的更好方法是使用数据库迁移框架。源码版本控制工具可以跟踪源码文件的变化,类似地,数据库迁移框架能跟踪数据库模式的变化,然后增量式的把变化应用到数据库中。


5.11.1创建迁移数据库

首先,我们要在虚拟环境中安装Flask-Migrate:

(venv) $ pip install flask-migrate

这个扩展的初始化方法如下:

(五)|Flask Web开发-数据库操作

为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到Flask-Script的manager对象中。


在维护数据库迁移之前,要使用init子命令创建迁移仓库。


5.11.2创建迁移脚本

在Alembic中,数据库迁移用迁移脚本表示。脚本中有两个函数,分别是upgrade()和downgrade()。Upgrade()函数把迁移中的改动应用到数据库中,downgrade()函数则将改动删除。Alembic具有添加和删除改动的能力,因此数据库可重设到修改历史的任意一点。


我们可以使用revision命令手动创建Alembic迁移,也可使用migrate命令自动创建。手动创建的迁移只是一个骨架,upgrade()和downgrade()函数都是空的,开发者要使用Alembic提供的Operations对象指令实现具体操作。自动创建的迁移会根据模型定义和数据库当前状态之间的差异生成upgrade()和downgrade()函数的内容。


自动创建的迁移不一定总是正确的,有可能会漏掉一些细节,自动生成迁移脚本后一定要进行检查。


5.11.3更新数据库

检查并修正好迁移脚本后,我们可以使用db upgrade命令把迁移应用到数据库中:

(五)|Flask Web开发-数据库操作

对第一个迁移来说,其作用和调用db.create_all()方法一样。但在后续的迁移中,upgrade命令能把改动应用到数据库中,且不影响其中保存的数据。



我今天才知道,我之所以漂泊就是在向你靠近。

--《廊桥遗梦》


以上是关于|Flask Web开发-数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

Python+Flask+MysqL的web建设技术开发一个网站

Web开发Flask框架基础知识

Python框架学习之Flask中的数据库操作

|Flask Web开发实战

python web开发-flask连接sqlite数据库

第5章:数据库-Flask Web 开发(第2版)