一 连接数据库
在Flask-SQLAlchemy 中,数据库被指定为URL,MySQL的数据库引擎的URL格式如下:
mysql://username:password@hostname/database
hostname 托管MySQL服务的服务器,也可以是远程服务器
database 要使用的数据库名
username password 使用数据库的用户凭证
SQLALCHEMY_COMMIT_ON_TEARDOWN可以设置为True,
来启用自动提交数据库更改在每个请求中
由SQLAlchemy实例化的db对象表示数据库且提供访问Flask-SQLAlchemy的所有功能
二 定义数据库
tablename类变量定义数据库中表的名称。
如果tablename缺省,Flask-SQLAlchemy会指定默认的表名,但是这些缺省名称不遵守使用复数命名的约定,所以最好是显式命名表名。
其余的变量是模型的属性,被定义为db.Column类的实例
传给db.Column构造函数的第一个参数是数据库列的类型也就是模型属性的数据类型
见flask-sqlalchemy使用(基础知识)
db.Column剩余的参数为每个属性指定了配置选项
见flask-sqlalchemy使用(基础知识)
模型包含了repr()方法来给它们显示一个可读字符串,虽然不是完全必要,不过用于调试和测试还是很不错的
三 建立外键
添加给User模型的role_id列被定义为外键,且建立关系。
db.ForeignKey()的参数roles.id指定的列应该理解为在roles表的行中持有id值的列
添加到Role模型的users属性表现了关系的面向对象的观点。给定Role类的实例,
users属性会返回一组连接到该角色的用户。指定给db.relationship()的第一个参数表明模型中关系的另一边。如果类还未定义,这个模型可以作为字符串提供。
ForeignKey类的column接收三种类型的参数,
一种是“模型名.属性名”;
一种是“表名.列名”,
最后一种没看明白,下次试着用一下。
db.relationship()的backref参数通过给User模型增加role属性来定义反向关系。这个属性可以替代role_id访问Role模型,是作为对象而不是外键。
大多数情况下db.relationship()可以定位自己的外键关系,但是有时候不能确定哪个列被用作外键。例如,如果User模型有两个或更多列被定义为Role的外键,SQLAlchemy将不知道使用两个中的哪一个。每当外键配置模棱两可的时候,就必须使用额外参数db.relationship()。表格5-4列出一些常用配置选项用于定义关系。