Flask Web开发 第一部分 第5章 数据库
来源:互联网 发布:美工陈列是做什么 编辑:程序博客网 时间:2024/06/16 08:13
5.6 定义模型
Flask-SQLAlchemy 创建的数据库实例为模型提供了一个基类以及一系列辅助类和辅助函数,可用于定义模型的结构。图 5-1 中的 roles 表和 users 表可定义为模型 Role 和 User。
class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) def __repr__(self) return '<Role %r>' % self.nameclass User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key = True) username = db.Column(db.String(64), unique=True, index=True) def __repr__(self): return '<User %r>' % self.username
5.7 关系
class Role(db.Model): #... users = db.relationship('User', backref='role')class User(db.model): role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
如图所示,关系使用 users 表中的外键连接了两行。添加到 User 模型中的 role_id 列
被定义为外键,就是这个外键建立起了关系。传给 db.ForeignKey() 的参数 ‘roles.id’ 表
明,这列的值是 roles 表中行的 id 值。
添加到 Role 模型中的 users 属性代表这个关系的面向对象视角。对于一个 Role 类的实例,
其 users 属性将返回与角色相关联的用户组成的列表。 db.relationship() 的第一个参数表
明这个关系的另一端是哪个模型。如果模型类尚未定义,可使用字符串形式指定。
5.11 使用Flask-Migrate实现数据库迁移
配置Flask-Migrate
from flask——migrate import Migrate, MigrateCommand#...migrate = Migrate(app, db)manager.add_command('db', MigrateCommand)
为了导出数据库迁移命令,Flask-Migrate 提供了一个 MigrateCommand 类,可附加到 Flask-
Script 的 manager 对象上。在这个例子中, MigrateCommand 类使用 db 命令附加。
在维护数据库迁移之前,要使用 init 子命令创建迁移仓库:
(venv) $ python hello.py db init Creating directory /home/flask/flasky/migrations...done Creating directory /home/flask/flasky/migrations/versions...done Generating /home/flask/flasky/migrations/alembic.ini...done Generating /home/flask/flasky/migrations/env.py...done Generating /home/flask/flasky/migrations/env.pyc...done Generating /home/flask/flasky/migrations/README...done Generating /home/flask/flasky/migrations/script.py.mako...done Please edit configuration/connection/logging settings in '/home/flask/flasky/migrations/alembic.ini' before proceeding.
这个命令会创建 migrations 文件夹,所有迁移脚本都存放其中。数据库迁移仓库中的文件要和程序的其他文件一起纳入版本控制。
5.11.2 创建迁移脚本
在 Alembic 中,数据库迁移用迁移脚本表示。脚本中有两个函数,分别是 upgrade() 和downgrade() 。 upgrade() 函数把迁移中的改动应用到数据库中, downgrade() 函数则将改动删除。Alembic 具有添加和删除改动的能力,因此数据库可重设到修改历史的任意一点。
我们可以使用 revision 命令手动创建 Alembic 迁移,也可使用 migrate 命令自动创建。手动创建的迁移只是一个骨架, upgrade() 和 downgrade() 函数都是空的,开发者要使用Alembic 提供的 Operations 对象指令实现具体操作。自动创建的迁移会根据模型定义和数
据库当前状态之间的差异生成 upgrade() 和 downgrade() 函数的内容。
自动创建的迁移不一定总是正确的,有可能会漏掉一些细节。自动生成迁移脚本后一定要进行检查。
migrate 子命令用来自动创建迁移脚本:
(venv) $ python hello.py db migrate -m "initial migration"INFO [alembic.migration] Context impl SQLiteImpl.INFO [alembic.migration] Will assume non-transactional DDL.INFO [alembic.autogenerate] Detected added table 'roles'INFO [alembic.autogenerate] Detected added table 'users'INFO [alembic.autogenerate.compare] Detected added index'ix_users_username' on '['username']'Generating /home/flask/flasky/migrations/versions/1bc594146bb5_initial_migration.py...done
检查并修正好迁移脚本之后,我们可以使用 db upgrade 命令把迁移应用到数据库中:
(venv) $ python hello.py db upgradeINFO [alembic.migration] Context impl SQLiteImpl.INFO [alembic.migration] Will assume non-transactional DDL.INFO [alembic.migration] Running upgrade None -> 1bc594146bb5, initial migration
对第一个迁移来说,其作用和调用 db.create_all() 方法一样。但在后续的迁移中,upgrade 命令能把改动应用到数据库中,且不影响其中保存的数据。
- Flask Web开发 第一部分 第5章 数据库
- Flask Web开发 第一部分 第3章 模版
- Flask Web开发 第一部分 virtualenv & 第2章 Flask程序的基本结构
- 《Flask Web开发》读书笔记(5)第5章数据库(关键词:Web开发/Flask/数据库)
- 第一部分 flask简介《Flask Web开发:基于Python的Web应用开发实战》
- Flask Web 开发 数据库
- Flask Web开发 第1章
- Flask Web开发 第2章
- Flask Web开发 第3章
- [Flask Web开发] 第6章 电子邮件
- flaskWeb开发(基于python的web开发实战)-第一部分-Flask简介
- Flask Web 开发 数据库迁移
- 《Flask Web开发》读书笔记(1)第1章安装(关键词:Web开发/Flask)
- 《Flask Web开发》读书笔记(3)第1章安装(关键词:Web开发/Flask)
- 《Flask Web开发》读书笔记(6)第6章电子邮件(关键词:Web开发/Flask/电子邮件)
- 《Flask Web开发》读书笔记(4)第4章Web表单(关键词:Web开发/Flask/表单/Web表单)
- 《flask web开发》第六章flask-mail
- flask web开发第七章如何创建项目中的数据库
- 基于TCP/UDP的Socket网络通信系列之客户端与服务器的简单对话(三)
- 架构(HTML)样式(CSS)行为(JavaScript)三者分离
- 最长递增子序列
- PAT程序设计考题——甲级1007 (最大连续子序列和) C++实现
- jquery的使用----$.each(数组/json数据,function (int/key(变量名随意),value(值变量名) ))
- Flask Web开发 第一部分 第5章 数据库
- 第一篇博客
- JNI env 总结
- Android 图形库skia 显示字体
- Centos 7.0 下hadoop集群模式安装(以3个节点为例,master,slave1,slave2)超详细
- ROM、RAM、DRAM、SRAM和FLASH的区别
- 分针网—每日分享:MySQL全文索引应用简明教程
- json前后端处理,避免解析错误问题
- linux在命令行直接打开图形文件夹