0%

Flask-SQLAlchemy基础操作

5.8.1 创建表

首先,我们要让 Flask-SQLAlchemy 根据模型类创建数据库。方法是使用 db.create_all()
函数:
(venv) $ python hello.py shell

from hello import db
db.create_all()
如果你查看程序目录,会发现新建了一个名为 data.sqlite 的文件。这个 SQLite 数据库文件
的名字就是在配置中指定的。如果数据库表已经存在于数据库中,那么 db.create_all()
不会重新创建或者更新这个表。如果修改模型后要把改动应用到现有的数据库中,这一特
性会带来不便。更新现有数据库表的粗暴方式是先删除旧表再重新创建:
db.drop_all()
db.create_all()
(续)
数据库 | 51
遗憾的是,这个方法有个我们不想看到的副作用,它把数据库中原有的数据都销毁了。本
章末尾将会介绍一种更好的方式用于更新数据库。

下面这段代码创建了一些角色和用户:

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 管理的。现在这些对象只存在于
Python 中,还未写入数据库。因此 id 尚未赋值:
print(admin_role.id)
None
print(mod_role.id)
None
print(user_role.id)
None
通过数据库会话管理对数据库所做的改动,在 Flask-SQLAlchemy 中,会话由 db.session
表示。准备把对象写入数据库之前,先要将其添加到会话中:
db.session.add(admin_role)
db.session.add(mod_role)
db.session.add(user_role)
db.session.add(user_john)
db.session.add(user_susan)
db.session.add(user_david)
或者简写成:
db.session.add_all([admin_role, mod_role, user_role,
… user_john, user_susan, user_david])
为了把对象写入数据库,我们要调用 commit() 方法提交会话:
db.session.commit()
再次查看 id 属性,现在它们已经赋值了:
52 | 第 5 章
print(admin_role.id)
1
print(mod_role.id)
2
print(user_role.id)
3
数据库会话 db.session 和第 4 章介绍的 Flask session 对象没有关系。数据库
会话也称为事务。
数据库会话能保证数据库的一致性。提交操作使用原子方式把会话中的对象全部写入数据
库。如果在写入会话的过程中发生了错误,整个会话都会失效。如果你始终把相关改动放
在会话中提交,就能避免因部分更新导致的数据库不一致性。
数据库会话也可 回滚 。调用 db.session.rollback() 后,添加到数据库会话
中的所有对象都会还原到它们在数据库时的状态。

1
2
3
4
5
6
7
8
9
10
8.4.1 准备用于登录的用户模型
要想使用 Flask-Login 扩展,程序的 User 模型必须实现几个方法。需要实现的方法如表 8-1
所示。
82 | 第 8 章
表8-1 Flask-Login要求实现的用户方法
方  法 说  明
is_authenticated() 如果用户已经登录,必须返回 True ,否则返回 False
is_active() 如果允许用户登录,必须返回 True ,否则返回 False 。如果要禁用账户,可以返回 False
is_anonymous() 对普通用户必须返回 False
get_id() 必须返回用户的唯一标识符,使用 Unicode 编码字符串
iBoy wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!