2011-10-17 11 views
9

Jestem nowy w sqlalchemy. Próbuję dostać zapytanie do pracy i mam problemy z łączeniem.Błąd SQLAlchemy - "Skonfiguruj jeden lub więcej atrybutów dla kolumn o tej samej nazwie jawnie."

Mam dwie tabele, z których każda ma kolumnę o nazwie "Id" i muszę dołączyć do tego stołu. Mój kod wygląda następująco:

table1 = server.tab1 
table2 = server.tab2 
joined = server.join(table1,table2, table1.Id == table2.Id) 
where = table1.createDate > start 
results = joined.filter(where).all() 

Pośrednio łącząc kolumna table1.Id z kolumny table2.id pod atrybutu „id”. Skonfiguruj jedno lub więcej atrybutów dla tych kolumn o tej samej nazwie jawnie.

Pytanie brzmi, jak skonfigurować te atrybuty?

TIA!

Odpowiedz

-2

Można użyć dołączyć funkcji dostarczanych przez SQLAlchemy, patrz poniższy przykład, nie trzeba tego robić ręcznie sqlalchme robi to dla nas,

from sqlalchemy import create_engine, Column, String, Integer, Table, ForeignKey 

from sqlalchemy.orm import mapper, relationship 
from sqlalchemy.schema import MetaData 
from sqlalchemy.orm.session import sessionmaker 

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

class User(Base): 
    __tablename__ = 'users' 

    id = Column('user_id',Integer,primary_key = True) 
    name = Column('user_name',String(20)) 

    addresses = relationship("Address",backref="user") 

class Address(Base): 
    __tablename__ = 'addresses' 

    id = Column('user_id',ForeignKey('users.user_id')) 
    address = Column('address',String(30)) 
    pk = Column('address_id',Integer,primary_key=1) 

if __name__ == "__main__": 
    engine = create_engine("sqlite://", echo = True) 
    Base.metadata.create_all(engine) 
    session = sessionmaker(bind=engine)() 

    u1 = User(name='japan') 
    session.add(u1) 
    session.commit() 
    u1.addresses.append(Address(address='a1')) 
    u1.addresses.append(Address(address='a2')) 
    session.flush() 
    q = session.query(User).join(User.addresses).all() 
    print "="*23,q 
+1

To obejście omija podstawowy problem. Nadal zastanawiam się, jak to zrobić z dynamicznie zamapowanych modeli przy użyciu SqlSoup. – Devin

1

z zupą sql

joined = server.session.query(table1).join((table2,table1.id == table2.id)) 
where = table1.createDate > start 
results = joined.filter(where).all() 
1

miałem ten sam problem, więc pomyślałem, że dodam rozwiązanie, które wymyśliłem (na podstawie http://www.mail-archive.com/[email protected]/msg23735.html). To z pewnością nie należy do najczystszych rzecz, jaką kiedykolwiek kodowane, ale za pomocą przykładu z góry, byłoby to około:

from sqlalchemy import select 
aliased_table1 = select([ 
    table1.c.Id.label("renamed_id_col"), 
    table1.c.any_other_columns_you_want_returned_but_not_renamed, 
    ... 
]).correlate(None).alias() 
joined = server.join(aliased_table1, table2, aliased_table1.c.renamed_id_col == table2.Id) 
where = aliased_table1.c.createDate > start 
results = joined.filter(where).all() 
0

Jednym ze sposobów jest to, aby oznaczyć wszystkie kolumny w jednej z tabel, tak aby nie mają żadnej kolizji nazw kolumna:

table1 = server.tab1 
table2 = server.with_labels(server.tab2) 
joined = server.join(table1,table2, table1.Id == table2.tab2_Id) 
where = table1.createDate > start 
results = joined.filter(where).all() 

tabela 2 kończy się znakowany tabela, gdzie wszystkie nazwy kolumn są poprzedzone nazwą tabeli, tak aby nie kolidować z nazwami kolumn w tabela1.

Powiązane problemy