更新列
遇到的问题
学习到 8.4.6 测试登录时
|
报错说表中无 email 列
确认代码无误后,判断应该是没有成功更新 models.py 中新建的 email 列,简单尝试无果,决定重新看一遍相关内容加深理解,再着手解决
粗暴的更新方法
如果数据库表已经存在于数据库中, 那么 db.create_all() 不会重新创建或者更新这个表。如果修改模型后要把改动应用到现有的数据库中,这一特 性会带来不便。更新现有数据库表的粗暴方式是先删除旧表再重新创建:
|
使用 Flask-Migrate 实现数据库迁移
更新表的更好方法是使用数据库迁移框架。源码版本控制工具可以跟踪源码文件的变化, 类似地,数据库迁移框架能跟踪数据库模式的变化,然后增量式的把变化应用到数据库中。
SQLAlchemy 的主力开发人员编写了一个迁移框架,称为 Alembic(https://alembic.readthedocs. org/en/latest/index.html) 。 除 了 直 接 使 用 Alembic 之 外, Flask 程 序 还 可 使 用 Flask-Migrate (http://flask-migrate.readthedocs.org/en/latest/)扩展。这个扩展对 Alembic 做了轻量级包装,并 集成到 Flask-Script 中,所有操作都通过 Flask-Script 命令完成。
安装与配置略过不提
几次尝试后,方才对几个主要命令的实际作用有了正确的理解
init
创建迁移仓库和脚本,并不会生成或更新数据库文件,migrations/versions/
中为空,如果此时upgrade
会生成一个只包含alembic_version
表的数据库
|
migrate
检测对数据库的操作,生成迁移脚本保存到migrations/versions/
中,用于数据库迁移
不过按官方文档所说,不一定能检测到所有对数据库的修改,所有需要自己对生成的迁移脚本进行检查,加上可能有遗漏的地方
upgrade
用于把上述迁移运用到数据库中,即至此才会真正对数据库进行更新
|
管理员角色
遇到的问题
学习到 10.3.2后,发现以管理员邮箱注册的帐号并不能打开管理员级别的资料编辑器
手动查看数据库:
发现role_id
项为空,即角色没有被成功赋予
Role.insert_roles()
回去翻书,找到 9.3 最后的部分说到
在你阅读下一章之前,最好重新创建或者更新开发数据库,如此一来,那些在实现角色和 权限之前创建的用户账户就被赋予了角色。
然而实测发现,对于管理员用户,必须在注册之前就完成 9.1 最后的Role.insert_roles()
步骤,才能成功为管理员邮箱用户赋予管理员角色
|
注册管理员邮箱