第五章
5.3.1链接数据库服务器
-
Flask—SQLAlchemy中,数据库的URI通过配置SQLALCHEMY_DATABASE_URI设置,默认为SQLite内存型数据库
5.3.2定义数据库模型
-
数据模型类需要继承db.Model基类,表的字段列由db.Column类的实例表示,字段列的类型通过第一个参数传入
-
根据模型类的名称生成一个表名称,规则是单个单词转换为小写,多个单词转为小写并使用下划线分割。若想指定表名称,定义_tablename_属性定义
-
字段名默认为类属性名,也可以给字段类设置name关键字参数指定
5.3.3创建数据库和表
-
创建模型类后,我们需要手动创建数据库和对应的表,即:建库和建表,通过db.create_all()方法实现
-
数据库和表一旦创建后,之后对模型的改动不会自动作用到实践的表中,直接调用create_all()也不会更新。需要调用db.drop_all()方法删除数据库和表,然后调用db.create()方法创建。注意:这种方式不会保存表中的数据
5.4数据库操作
-
对数据库的操作通过数据库会话进行,数据库会话是个临时存储区,改动都存在这里。db.session
-
调用add()方法将创建的对象加到会话中,只有对会话调用commit()方法,改动才提交到数据库,也可以调用rollback()完成回滚操作
5.4.1CRUD
-
Create主要分三步
-
实例化模型类作为一个记录。note=Note(...)
-
将记录加到数据库回话中。db.session.add(note),也可以使用add_all()一次包含所有记录对象的列表
-
提交回话。db.session.commit()
-
-
Read,模式:<模型类>.query.<过滤方法>.<查询方法>
-
Update:直接赋值给模型类的字段属性就可以,然后调用commit()方法提交会话
-
Delete:db.session.delete(模型实例),然后commit()提交会话
5.5.1配置python shell上下文
-
使用shell需要手动导入db对象和相应的模型类,使用app.shell_context_processor装饰器注册shell上下文处理函数
-
上下文处理函数需要返回包含变量和变量值的字典
5.5.2一对多、多对一
-
首先定义外键:外键只能存储单一数据(标量),实例化db.Column()是传入db.ForeignKey(表名.主键字段名),外键总是定义在多的那侧。注意:这里是表名,不是模型类的名称
-
再定义关系属性:不使用Column类声明列,而使用db.relationship()关系函数定义关系属性,这个属性返回多个记录,一般称为集合关系属性
-
relationship()函数的第一个参数为关系另一侧的模型名称。注意:这里是模型名称,不是表名
-
-
建立关系
-
为外键字段赋值
-
操作关系属性,集合关系属性可以像列表一样操作。foo.articles.append()建立关系。foo.articles.remove()解除关系
-
-
双向关系:给relationship()函数设置back_populates参数,值为另一侧的关系属性名,注意:这个参数是显式设置双向关系,还有隐式设置的参数
5.5.4一对一
-
关系两侧都设置标量关系属性即可
5.5.5多对多
-
需要再创建个关联表,关联表不存储数据,只用来存储关系两侧模型的外键对应关系。
-
关联表使用db.Table类定义,传入第一个参数是关联表名称,在关联表中定义了两个外键字段
-
模型类中定义关系属性,除了第一个参数是另一侧的模型名称外,还需要添加secondary参数,把这个值设为关联表的名称。
5.6Flask-Migration
-
实例化Migrate类时,传入程序实例app和db对象
5.6.2Flask-Migrate迁移数据库
-
先创建迁移环境:使用flask db init命令,迁移环境只需创建一次,会在根项目中创建migrations文件夹
-
再生成迁移脚本:使用flask db migration -m ‘提示信息’。-m参数用来添加迁移备注信息。
-
更新数据库:flask db upgrade
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。