SQLALchemy主表与子表映射成功,查询子表数据为空的问题,不容忽视的小问题

完成数据库连接建表后,使用db.session.add(),db.session.commit()把需要存的数据保存到数据库表,同时对两张表建立了一对多的关系,但是通过主表反向查询,遍历子表结果的list为空。翻来覆去找,究竟是外键搞错了,还是relatiaoship弄错了,后来发现,注意了,是子表存数据时并没有给外键id赋值,导致查询为空。

#对两个表建立一对多关系

class Person(db.modle):

__tablename__ = 'person'

id = db.Column(Integer,primary_key=True,autoincrement=True)

name = db.Column(String(50),nullable=False)

pets = db.relationship("Pet", backref = "owner")

class Pet(db.modle):

__tablename__ = 'owner'

id =db. Column(Integer,primary_key=True,autoincrement=True)

name =db. Column(String(50),nullable=False)

owner_id = db. Column(Integer,db.Forignkey("person.id"))

#两个表插入数据

person = Person(name="Jhon")

pet = Pet(name="Dog",owner_id =person.id )#这种写法保证两个表的id一致

#pet = Pet(name="Dog",owner_id =1 )#示例大多这样写的

一定要这样显式的赋值子表外键值,否则主表和子表同样没法正反向查询。很多博主介绍直接忽略这个小细节,我也没注意,纠错一天才发现,希望能帮助到大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy中,跨查询可以使用join()函数实现。假设我们有两个,一个是User,一个是Order,它们之间存在外键关系,我们要查询所有用户及其关联的订单信息,可以按以下步骤进行操作: 1. 定义结构 ```python from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) orders = relationship("Order", back_populates="user") class Order(Base): __tablename__ = 'orders' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) amount = Column(Integer) user = relationship("User", back_populates="orders") ``` 2. 创建Session并查询数据 ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('sqlite:///example.db') Session = sessionmaker(bind=engine) session = Session() # 使用join查询所有用户及其关联的订单信息 query = session.query(User, Order).join(Order) # 打印查询结果 for user, order in query.all(): print(f"User: {user.name}, Order: {order.amount}") ``` 在这个例子中,我们使用join()函数将User和Order连接起来,并且通过relationship定义了之间的关系。在查询时,我们使用session.query()函数查询所有用户及其关联的订单信息,并通过join()函数将两个连接起来。最后,我们通过for循环遍历查询结果并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值