外键以及relationship
首先创建模型类,根据模型类创建数据库,在这里一个user对应多个email_address,因此需要在address上增加一个user_id这个外键(一对多关系)
class User(Base):
__tablename__='t_user'
id = Column(Integer, primary_key=True)
name = Column(String(32))
address=relationship('Address',backup=backup('user'),order_by="Address.id")
def __repr__(self):
return f'{self.id}{self.name}'
class Address(Base):
__tablename__='t_address'
id = Column(Integer, primary_key=True)
email_address = Column(String(32), nullable=False)
#外键字段
user_id=Column(Integer,ForeignKey('user.id'))
def __repr__(self):
return f'{self.id}{self.email_address}'
Base.metadata.create_all()
#Base.metadata.drop_all()
插入数据:
def save():
#插入User表数据
res=User(name='kobe3')
session.add(res)
session.commit()
#插入Address表数据
res1=Address(email_address='北京',user_id=1)
res2=Address(email_address='北京',user_id=2)
res3=Address(email_address='济南',user_id=3)
res4=Address(email_address='长沙',user_id=4)
session.add_all([res1,res2,res3,res4])
session.commit()
查询数据:
使用join方法:查询用户id为4的姓名和地址(不在一张表),需要关联起来
res=session.query(User).join(Address).filter(User.id==Address.user_id).filter(User.id==4).first()
print(res)
不使用join方法:
res=session.query(User.name,Address.email_address).filter(User.id==Address.user_id).first().name
print(res)
当不存在外键时,使用下面的方法进行读取数据
res2=session.query.join(Address,User.id==Address.user_id).filter(Address.user_id==1).first()
print(res2)
子查询
查询地址和id=1相同的人物信息
res3=session.query(Address.email_address.label('city')).filter(Address.id==1).subquery()
print(res3)
res4=session.query(Address).filter(Address.email_address==res3.c.city).all()
print(res4)
统计每个用户的email地址的数量,
联接子句,注意子句中需要使用c来调用字段内容
先写子查询
res6=session.query(Address.user_id,func.count('*').label('address_count')).group_by(Address.user_id).subquery()
再写父查询
res7=session.query(User.name,res6.c.address_count).outerjoin(res6,User.id==res6.c.user_id).all()
print(res7)
包含contains
res5=session.query(Address).filter(Address.email_address.contains('长')).all()
print(res5)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74160.html