标签:关系 Web 定义 Flask 数据库 db 第五章 模型 属性
第五章
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
标签:关系,Web,定义,Flask,数据库,db,第五章,模型,属性 来源: https://www.cnblogs.com/zzusmallstudent/p/15268772.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。