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

外键以及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)
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flask 中使用 SQLAlchemy 进行 JOIN 操作,可以通过在查询中使用 `join()` 方法来实现。下面是一个示例代码: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80), nullable=False) content = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) user = db.relationship('User', backref=db.backref('posts', lazy=True)) @app.route('/') def index(): posts = db.session.query(Post).join(User).filter(User.username == 'john').all() return str(posts) ``` 上面的代码中,我们定义了两个模型类 `User` 和 `Post`,并且在 `Post` 模型中定义了一个外键 `user_id`,它关联到了 `User` 模型的 `id` 字段。我们使用 `db.relationship()` 方法来定义了一个 `user` 属性,这个属性可以让我们通过 `post.user` 来访问到这个 `Post` 对象所属的 `User` 对象。 在视图函数中,我们使用 `db.session.query()` 方法来创建查询对象,然后使用 `join()` 方法来指定要关联的模型,最后使用 `filter()` 方法来添加查询条件。在这个例子中,我们查询所有属于用户名为 "john" 的用户的文章。 注意,在使用 `join()` 方法时,我们需要指定关联的属性名,这个属性名可以通过模型中定义的关系属性 `user` 来获取,即 `Post.user`。如果我们想要指定不同的属性名,可以使用 `join(User, Post.user_id == User.id)` 这样的语法来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值