sqlalchemy_relationship(外键)

1.设立外建

# 外键,是将主表中的主键,引入到从表中作为一个字段,从表中的这个字段就是称为外键
# 外建设立的语法(建立数据库链接的那一套动作参照前面的博文)
class User(Base):
	__tablename__= 'user'  # 表名
	id = Column(String,primary_key=True,autoincrement=True) # 主键字段
	username = Column(String(50),nullable-False) # 普通字段,非空

class Atticle(Base):
	__tablename__='article'
	id = Column(Integer,primary_key=True,autoinrement=True)
	...
	uid = Column(Integer,ForeignKey('user.id'))# 在Article模型中设立User模型中的主键id为外键,uid就是这个外键.

Base.metadata.drop_all() # 这个东西慎用,删除数据库中所有的表结构,清空数据库
Base.metadata.create_all() # 将数据模型映射到数据库中,创建数据表.

2.原始外键的使用(手动建立外键)

# 这里先做一个铺垫,数据库中表之间的关系分为1对多,1对1,多对多等这几种关系.

# 先在user表中插入一条记录
user = User(username='kangbazi')
session.add(usre)
session.commit()

# 在创建从表中的记录的时候,手动添加一个外键的值
article = Article(title='钢铁是怎么炼成的,问问西门官人',content="这个棍子掉的很是时候",uid=1) # 注意这里手动添加一个外键的值,与主表中的主键值对应
session.add(article)
session.commit()

uid = session.query(Article).first().uid # 获取外键值
#查询,这个时候想要查询与从表中记录相关的主表的记录,就是使用uid的值,作为过滤条件
user = session.query(User).filter_by(id=uid).first()/.all()
# 或者下面的查询语句
ser = session.query(User).gei(uid) # uid是实参,是一个具体的数据,它的形参是id 

3.ORM中relationship及backref建立表结构关系

3.1 一对多关系的建立

# 建立表关系必须要设立外键
from sqlalchemy.orm import relationship,backref
class User(Base):
	__tablename__ = 'user'
	id = Column(Iteger,primary_key=True,autoincrement=True) 
	...
class Article(Base):
	__tablename__ = 'article'
	...(同前)
	uid = Column(Iteger,ForeignKey(user.id)) # 从表中的外键必须要设立,因为relationship是基于外键进行的
	author = relationship("User",backref="articles") # 这里通过在从表中设置author属性与主表进行链接,同时,在后创建从表记录的时候,通过将主表中的对象作为参数传递给author作为值,这个步骤会自动给传递进来的对象添加一个属性,article.主表中的对象通过调用属性article,也可以找到相对应的从表中的记录.
	
	...
	user = User(...) # 创建一个新的主表中的对象/或者查询出来一个对象,总之user是主表中的一条记录
	article = Article(...) # 创建一个从表对象,!!!!!!注意不需要对从表中的uid 和 author 属性进行赋值,执行下面的操作,会自动为这两个属性进行赋值
	article.author = user # 这个操作很神奇,它会根据主表中user的id,设置article中外键的值,并且也会自动地将bacref的值articles 设置为user的属性,并且值为article.
	session.commit()

# 创建完数据之后就可以调用了
user = session.query(User).first()
article = user.articles  # 此时article就是与之对应的从表中的那条纪录(是一个对象列表,因为是1对多的关系,可以有很多个从表)
article.author # 这个语句也可以将主表中对应的对象那个找出来

3.2一对一关系

# 在从表中将relationship中的参数backref='...'  改成  backref = backref('主表中增加的关联属性名',uselist=False)就可以了 

3.3多对多关系

# 多对多关系需要借助第三张表进行(这样做更方便)
third_table = Table(  # Table是个什么东西,不怎么了解,就知道这么用就对了
	'tabl3',  # 第三张表的名字
	Base.metadata, # 这参数是个什么玩意不了解,但是知道Base与数据库有关,反正与数据库车上关系了
	Column('article_id',Integer,ForeignKey("A.id"),primary_key=True), # 这里创建A表的外建字段
	Column('tag_id',Integer,ForeignKey('B.id'),primary_key=True) # 这里创建B表的外建字段
)  

# 随便在A模型或者B模型中添加一个链接属性,这里以B模型为例
class B(Base):
	__tablename__ = 'b'
	id = ....
	...(其他字段)
	
	attrB = relationship('B',backref='b',secondary=third_table) # 这条语句完成了三张表的链接,建立起A,B模型之间的多对多关系

# Base.metadata.drop_all() # 这条语句是删除数据库中所有的表,相当于清空数据库
# Base.metadata.create_all() # z和两条语句是创建表结构及表之间的关系的,想要进行数据操作,之前必须生成表结构

# 在后面实例化对象的时候注意,需要给attrB属性传递对象作为属性值
# 创建对象,也可以查询出对象
a1 = A(...)
a2 = A(...)
b1 = B(...)
b2 = B(...)
# 属性赋值
a1.table3.append(b1)# 这里就是给a1记录的b属性增加一个值,这个值是b1对象
a1.table3.append(b2)# 多对多关系,所以可以添加多个对象
a2.table3.append(b1)  
a2.table3.append(b2)  
session.add([a1,a2])
session.commit() # 一次性提交,完成数据的插入
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值