繁体   English   中英

sqlalchemy关系映射

[英]sqlalchemy relational mapping

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

    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'对象不支持索引

我知道居民可以在那里定义这种关系,但我怎么能得到给定地址分配给居民的名单?! 谢谢

您在错误的位置定义关系。 我认为你将声明扩展non-declarative使用混合:

  1. 使用declarative ,您可以在model定义关系。
  2. 否则,在将model映射到table时定义它们

如果您正在执行option-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配置不正确,请参阅上面的代码了解适用的版本。

您可以尝试在Address之后定义Person,并使用backref to Address - 这将创建数组元素:

class Address(object):
 __tablename__ = 'address_table'
 idAddress = Column("idAddress", Integer, primary_key=True)

class Person(object):
 idPerson = Column("idPerson", Integer, primary_key = True)
 ...
 address_id = Column(Integer, ForeignKey('address_table.idAddress'))
 address = relationship(Address, backref='residents')

然后你可以查询:

myaddress = session.query(Address).get(1);
for residents in myaddress.residents:
  print name

此外,如果您在地址中有很多居民,您可以使用加入进一步过滤:

resultset = session.query(Address).join(Address.residents).filter(Person.name=='Joe')
# or
resultset = session.query(Person).filter(Person.name=='Joe').join(Person.address).filter(Address.state='NY')
and resultset.first() or resultset[0] or resultset.get(...) etc...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM