2011-10-17 22 views
9

Tôi là thương hiệu mới với sqlalchemy. Đang cố gắng để có được một truy vấn để làm việc và đang gặp vấn đề với một tham gia.Lỗi SQLAlchemy - "Vui lòng định cấu hình một hoặc nhiều thuộc tính cho các cột có cùng tên này một cách rõ ràng."

Tôi có hai bảng trong đó có cả hai cột có tên là "Id" và tôi cần tham gia trên bảng đó. Mã của tôi trông giống như sau:

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

Kết hợp hoàn toàn bảng cột1.Id với cột bảng2.Id trong thuộc tính 'Id'. Vui lòng định cấu hình một hoặc nhiều thuộc tính cho các cột có cùng tên này một cách rõ ràng.

Câu hỏi là, làm cách nào để định cấu hình các thuộc tính này?

TIA!

Trả lời

-2

Bạn có thể sử dụng tính năng tham gia cung cấp bởi SQLAlchemy, xem ví dụ dưới đây, không cần phải làm điều đó bằng tay sqlalchme hiện nó cho chúng ta,

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

Cách giải quyết này tránh được vấn đề cốt lõi. Vẫn tự hỏi làm thế nào để làm điều này với các mô hình ánh xạ động bằng cách sử dụng SqlSoup. – Devin

1

Với súp sql

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

tôi đã cùng một vấn đề này vì vậy tôi figured tôi sẽ thêm các giải pháp tôi đã đưa ra (dựa trên http://www.mail-archive.com/[email protected]/msg23735.html). Đó chắc chắn không phải là điều sạch nhất mà tôi từng mã hóa, nhưng bằng cách sử dụng ví dụ của bạn từ trên cao, nó sẽ là khoảng:

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

Một cách để ghi nhãn tất cả các cột vào một trong các bảng, để bạn không có bất kỳ va chạm của các tên cột:

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() 

table2 kết thúc lên được một bảng nhãn, nơi mà tất cả các tên cột được mở đầu với tên bảng, như vậy là không can thiệp vào tên cột trong table1.

Các vấn đề liên quan