2010-03-10 15 views
14

Aynı tabloya sqlalchemy'de katılmaya çalışıyorum.Aynı tabloya nasıl erişebilirsiniz sqlalchemy

#!/usr/bin/env python 
import sqlalchemy as sa 
from sqlalchemy import create_engine 
from sqlalchemy.orm import mapper, sessionmaker, aliased 

engine = create_engine('sqlite:///:memory:', echo=True) 

metadata = sa.MetaData() 
device_table = sa.Table("device", metadata, 
    sa.Column("device_id", sa.Integer, primary_key=True), 
    sa.Column("name", sa.String(255), nullable=False), 
    sa.Column("parent_device_id", sa.Integer, sa.ForeignKey('device.device_id')), 
    ) 

class Device(object): 
    device_id = None 
    def __init__(self, name, parent_device_id=None): 
     self.name = name 
     self.parent_device_id = parent_device_id 

    def __repr__(self): 
     return "<Device(%s, '%s', %s)>" % (self.device_id, 
              self.name, 
              self.parent_device_id) 

mapper(Device, device_table) 

metadata.create_all(engine) 

db_session = sessionmaker(bind=engine)() 

parent = Device('parent') 
db_session.add(parent) 
db_session.commit() 

child = Device('child', parent.device_id) 
db_session.add(child) 
db_session.commit() 

ParentDevice = aliased(Device, name='parent_device') 
q = db_session.query(Device, ParentDevice)\ 
    .outerjoin(ParentDevice, 
       Device.parent_device_id==ParentDevice.device_id) 

print list(q) 

Bu bana bu hata veriyor:

ArgumentError: Can't determine join between 'device' and 'parent_device'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.

Ama katılmak için onclause belirterek ediyorum bu ne denedim bir, minimal bir versiyonudur. Bunu nasıl yapmalıyım?

cevap

8

query.[outer]join için, katılır listesi olarak belirtmek yüzden böyle katılmak, tablonun 2 elemanlarını ve bir demet içinde onclause, koymak için gerekli:

q = db_session.query(Device, ParentDevice)\ 
    .outerjoin(
        (ParentDevice, Device.parent_device_id==ParentDevice.device_id) 
      ) 
3

Eşleştiriciniz iki öğe arasındaki bağlantıyı açıklamalı, burada bir örnek: adjacency list relationships. (. expression.[outer]join için farklıdır)

+0

Yukarıdaki örnek için bunu işe alamadım, ancak bu dokümana gösterici için teşekkürler. Benim farkında değil ki, benim app diğer bölümlerinde benim için yararlı olacak olan sqlalchemy bazı bölümleri beni tanıttı. –

+0

Gelecekte başvurmak için ... [bu bağlantı] (http://www.sqlalchemy.org/docs/orm/relationships.html#adjacency-list-relationships) daha günceldir ve bildirici bir örneğe sahiptir. – Russ