5.SQLAlchemy对两张有关联关系表查询
问题
例如,一个用户可以有多个收获地址。
定义表如下:
用户表
地址表
一般情况,我们会先查询用户表,拿到用户id后,再到地址表中查询关联的地址数据。这样就要执行两次查询。
仅仅为了方便查询,需要一些属性便利的去查询数据,但是这些属性不能出现在数据库中。
模型之间的关联
from exts import db
# 数据库模块需要继承db.Model
class User(db.Model):
# 定义表名
__tablename__ = "user"
# 定义字段
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), unique=True)
password = db.Column(db.String(100))
info = db.Column(db.JSON)
# 表示和地址模型进行关联,增加了一个addresses属性(这个属性不会再数据库表中对应出现)
# backref='user'表示是Address要使用的一个属性,只是反向定义到了这里
addresses = db.relationship('Address', backref='user')
# 打印一个可读的字符串
def __repr__(self):
return '<User: %s %s>' % (self.username, self.id)
class Address(db.Model):
# 定义表名
__tablename__ = "address"
# 定义字段
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
city = db.Column(db.String(10))
# Address希望有user属性,但是这个属性的定义需要在另一个模型中定义
def __repr__(self):
return '<Address: %s %s>' % (self.id, self.city)
@user2.route("/select_user", methods=['GET'])
def select_user():
get_user = db.session.query(User).filter(User.id == 2).first()
if get_user:
print(get_user.addresses)
return "select success"
@user2.route("/select_address", methods=['GET'])
def select_address():
all_address = db.session.query(Address).filter(Address.user_id == 2).all()
for addr in all_address:
print(addr.user)
return "select success"
注意:这些关联数据可以成功查询的前提是基于外键关系,数据库中的表可以不建立关键,但是Python代码的Model之间要定义好关系,比如:
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))