Sqlalchemy 在SQL Alchemy中,如何在字段列表中包含联接表中的字段?

Sqlalchemy 在SQL Alchemy中,如何在字段列表中包含联接表中的字段?,sqlalchemy,Sqlalchemy,以以下表格定义为例: class Device(Base): __tablename__ = 'devices' id = Column(Integer, primary_key = True) imei = Column(String(19)) class Position(Base): __tablename__ = 'positions' id = Column(Integer, primary_key = True) device_i

以以下表格定义为例:

class Device(Base):
    __tablename__ = 'devices'

    id = Column(Integer, primary_key = True)
    imei = Column(String(19))

class Position(Base):
    __tablename__ = 'positions'

    id = Column(Integer, primary_key = True)
    device_id = Column(Integer, ForeignKey('devices.id'))
    latitude = Column(Float(8))
    longitude = Column(Float(8))
    other = Column(String(512))

    device = relationship('Device', foreign_keys = [device_id])
我可以查询如下职位的特定字段:

>>> pos = session.query(Position.latitude, Position.longitude).first()
>>> pos
(-22.929775, -43.23409)
>>>
>>> pos = session.query(Position).first()
>>> pos.latitude, pos.longitude, pos.device.imei
(-22.929775, -43.23409, '123456789')
>>>
我可以长,拉特和伊梅我喜欢这样:

>>> pos = session.query(Position.latitude, Position.longitude).first()
>>> pos
(-22.929775, -43.23409)
>>>
>>> pos = session.query(Position).first()
>>> pos.latitude, pos.longitude, pos.device.imei
(-22.929775, -43.23409, '123456789')
>>>

如何查询纬度、经度和device.imei(如第一个示例中所示),而不必选择随附的所有其他数据(如第二个示例中所示)?

我想我已经找到了答案:

>>> session.query(Position.latitude, Position.longitude, Device.imei).join('device').first()
(-22.929775, -43.23409, '356891051241497')
>>>
有趣的是秩序很重要。这个不行:

>>> session.query(Device.imei, Position.latitude, Position.longitude).join('device').first()
Traceback (most recent call last):
  File "/Users/leandro/test/env/lib/python3.4/site-packages/sqlalchemy/orm/base.py", line 370, in _entity_descriptor
    return getattr(entity, key)
AttributeError: type object 'Device' has no attribute 'device'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/leandro/test/env/lib/python3.4/site-packages/sqlalchemy/orm/query.py", line 1724, in join
    from_joinpoint=from_joinpoint)
  File "<string>", line 2, in _join
  File "/Users/leandro/test/env/lib/python3.4/site-packages/sqlalchemy/orm/base.py", line 191, in generate
    fn(self, *args[1:], **kw)
  File "/Users/leandro/test/env/lib/python3.4/site-packages/sqlalchemy/orm/query.py", line 1798, in _join
    descriptor = _entity_descriptor(left_entity, onclause)
  File "/Users/leandro/test/env/lib/python3.4/site-packages/sqlalchemy/orm/base.py", line 374, in _entity_descriptor
    (description, key)
sqlalchemy.exc.InvalidRequestError: Entity '<class 'test.Device'>' has no property 'device'
>>> 
会话.查询(Device.imei,Position.latitude,Position.longitude).join('Device').first() 回溯(最近一次呼叫最后一次): 文件“/Users/leandro/test/env/lib/python3.4/site packages/sqlalchemy/orm/base.py”,第370行,在实体描述符中 返回getattr(实体,键) AttributeError:类型对象“设备”没有属性“设备” 在处理上述异常期间,发生了另一个异常: 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/Users/leandro/test/env/lib/python3.4/site packages/sqlalchemy/orm/query.py”,第1724行,在join中 from_joinpoint=from_joinpoint) 文件“”,第2行,在连接中 文件“/Users/leandro/test/env/lib/python3.4/site packages/sqlalchemy/orm/base.py”,第191行,在generate中 fn(自,*参数[1:],**千瓦) 文件“/Users/leandro/test/env/lib/python3.4/site packages/sqlalchemy/orm/query.py”,第1798行,在 描述符=_实体_描述符(左实体,onclause) 文件“/Users/leandro/test/env/lib/python3.4/site packages/sqlalchemy/orm/base.py”,第374行,在实体描述符中 (说明、图例) sqlalchemy.exc.InvalidRequestError:实体“”没有属性“device” >>>
实际上顺序很重要,因为第一个映射类被假定为查询类。如果您只是有一个
query(…)
子句,它就可以工作(并产生笛卡尔积),但是
join
不起作用,因为它试图用
Device
连接
Device
。解决这个问题的一种方法是在
位置上加入(
session.query(Device.imei,…).join('Position')
),但您必须为此定义backref(
设备=关系('Device',外键=[Device\u id],backref='Position')
。另一种方法是使用。