这个flask_sqlalchemy的外键是实现表与表的关联的,分为两个层面
- 数据库里边存上关联项
- 在程序的模型逻辑上简化实现表连接。
下面这个程序是利用db.ForeignKey('user.id')
在数据库里边建立外键,一般都是多的一方建立这个外键。并且这个外键在数据库中是有字段的,也是可以查到的。
from exps import db
class Article (db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title =db.Column(db.String(50),nullable=False)
#外键 左侧的建名必须参照右侧字符串所示的user.id里的内容存在才能建立 这个小写的user是数据库里边的表名不是模型类名!
user_id = db.Column(db.Integer,db.ForeignKey('user.id'),nullable=False) #这个是同步到数据库的,里边要存关系踺值的
而这几行程序关键是:db.relationship('Article',backref ='user' )
,他的存在是在模型类上实现表关联逻辑,数据库中无痕迹。
from exps import db
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(15),nullable=False)
#增加一个字段 ,以及反向引用
articles =db.relationship('Article',backref ='user' )#这块是给模板用的,不在数据库里体现,但是模板里边可以引用
使用的时候:
###正向引用,就把这个连接单个项当成关林那个模型的对应行就行
user = User.query.get(3) #举例用3号ID查出一个user行
for article in user.articles:
article.id#那就可以用这个user。articles查出Article表的对应项
article.title # 这个article就是被钩子勾过来的Article的查询结果具体行
####反向引用,就是用多的Article一方查出单独一行后可以点user反找其他项目,注意:下面的user是数据库中的表名不是模型的类名
articles = Article.query.all()
for article in articles:
article.title
article.user.username
article.user.phone
多对多情况下需要第三张表也就是关系表作为中间表
例如:一张表记录用户名字手机等信息,第二章表记录物品价格名称等信息,第三章表关系记录则一条条记录谁买了什么东西。这样就形成了多对多关系。
还原到模型上例如:
表一:用户信息表 ,注意:表连接采用第二关系表的方式secondary='guanxi'
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name=db.Column(db.String(30),nullable=False)
say=db.Column(db.String(100),nullable=False)
thing=db.relationship('Thing',backref= 'user',secondary='guanxi')#表连接采用第二关系表的方式`secondary='guanxi'`
def __str__(self):
return self.name
表二:物品信息表
class Thing(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name=db.Column(db.String(30),nullable=False)
coler=db.Column(db.String(100),nullable=False)
def __str__(self):
return self.name
表三:关系信息表
class Guanxi(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
u_id= db.Column(db.Integer,db.ForeignKey('user.id')) # 外键拉手user表的id
t_id= db.Column(db.Integer,db.ForeignKey('thing.id')) # 外键拉手thing表的id
关系建立后就可以互查了,正反查建立时,只需要一方建立即可,不可正反两个表互相建立db.relationship
会出错。写的时候会出现重要表不用修改,其他表和它建立正反查的情况这有利于保持程序分离。