【Flask】sqlalchemy高级用法(注意join的用法)

导读:本篇文章讲解 【Flask】sqlalchemy高级用法(注意join的用法),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

外键以及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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!