gpt4 book ai didi

python - sqlalchemy 关系映射

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:41 25 4
gpt4 key购买 nike

你好我有一个简单的问题 - 我有 2 个表(地址和用户 - 用户有一个地址,很多用户可以住在同一个地址)...我创建了一个这样的 sqlalchemy 映射:当我得到我的 session 并尝试查询类似的东西时

    class Person(object):
'''
classdocs
'''
idPerson = Column("idPerson", Integer, primary_key = True)
name = Column("name", String)
surname = Column("surname", String)
idAddress = Column("idAddress", Integer, ForeignKey("pAddress.idAddress"))
idState = Column("idState", Integer, ForeignKey("pState.idState"))
Address = relationship(Address, primaryjoin=idAddress==Address.idAddress)

class Address(object):
'''
Class to represent table address object
'''
idAddress = Column("idAddress", Integer, primary_key=True)
street = Column("street", String)
number = Column("number", Integer)
postcode = Column("postcode", Integer)
country = Column("country", String)
residents = relationship("Person",order_by="desc(Person.surname, Person.name)", primaryjoin="idAddress=Person.idPerson")




self.tablePerson = sqlalchemy.Table("pPerson", self.metadata, autoload=True)
sqlalchemy.orm.mapper(Person, self.tablePerson)
self.tableAddress = sqlalchemy.Table("pAddress", self.metadata, autoload=True)
sqlalchemy.orm.mapper(Address, self.tableAddress)


myaddress = session.query(Address).get(1);
print myaddress.residents[1].name

=> 我收到 TypeError: 'RelationshipProperty' object does not support indexing

我知道 residents 是用来定义关系的,但是我到底怎么才能得到给定地址分配给的居民列表?!谢谢

最佳答案

您在错误的地方定义了关系。我觉得你在混Declarative Extension 非声明式 使用:

  1. 当使用声明式时,您在模型中定义了您的关系。
  2. 否则,您在将 model 映射到 table 时定义它们

如果选项 2 是您正在做的,那么您需要从 models 中删除两个 relationship 定义,并将其添加到映射器(只有一个就足够了):

mapper(Address, tableAddress,
properties={'residents': relationship(Person, order_by=(desc(Person.name), desc(Person.surname)), backref="Address"),}
)

关于上面的代码还有一些事情:

  1. 关系仅在一侧定义。 backref关心对方。
  2. 您不需要指定 primaryjoin(只要您指定了 ForeignKey,并且 SA 能够推断列)
  3. 您的 order_by 配置不正确,请参阅上面的代码以了解有效的版本。

关于python - sqlalchemy 关系映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8294111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com