2014-09-21 3 views
7

sqlalchemy를 처음 사용했습니다. 나는 table1의 열 중 하나에SqlAlchemy에서 automap으로 클래스를 생성 한 후에 관계를 선언 할 수 있습니까?

from sqlalchemy import create_engine, MetaData, Column, Table, ForeignKey 
from sqlalchemy.ext.automap import automap_base, generate_relationship 
from sqlalchemy.orm import relationship, backref 
from config import constr, mytables 

def _gen_relationship(base, direction, return_fn, 
        attrname, local_cls, refferred_cls, **kw): 
    return generate_relationship(base, direction, return_fn, attrname, local_cls, refferred_cls, **kw) 

engine = create_engine(constr) 
metadata = MetaData() 
metadata.reflect(engine, only=mytables) 
Base = automap_base(metadata=metadata) 
Base.prepare(engine, reflect=True, generate_relationship=_gen_relationship) 
Tableclass1 = Base.classes.table1 
Tableclass2 = Base.classes.table2 

Table2.ID지도 DB를 MySQL의에서 관계를 가진 기존 DB의 오토 맵을 만들 자습서를 따랐다. 그러나 쿼리를 사용하여 table1table2에 가입하려고하면 "외래 키 관계를 찾을 수 없습니다"라는 오류가 발생합니다. 이후이 두 테이블의 관계를 알기 때문에 클래스 인스턴스가 생성 된 후에이 관계를 선언하는 방법이 있습니까? 아니면 쿼리 함수에서 명시 적으로이 관계를 말할 수있는 방법이 있습니까? 감사합니다.

답변

0

명시 적으로 onclause 조인 SQLAlchemy의 join 메서드를 사용하여이 작업을 수행 할 수 있습니다. onclause 매개 변수는 SQL의 JOIN과 유사하게 사용됩니다.

sqlalchemy.orm.join(table1, table2, onclause=table2.ID == table1.your_attribute) 

는 또한 국가는 단순히 클래스의 외래 키를 명시하여 데이터베이스에서 외래 키의 존재를 무시할 수 있습니다 :

Column('ID', Integer, ForeighKey('table1.your_attribute')) 
3

가 언급 한 @mpolednik 같이 쿼리에서이 작업을 수행하는 것이 가능하지만 , 귀하의 질문을 올바르게 읽으면 이상적인 해결책은 귀하의 반원들이 반복적으로 사용하도록 선언 한 관계를 유지하는 것입니다.

는 것만으로 달성 할 수 사전 선언 당신과 같이, 사용하고자하는 클래스 :

from sqlalchemy.ext.automap import automap_base 
from sqlalchemy.orm import Session, relationship 
from sqlalchemy import create_engine, Column, String 

Base = automap_base() 

engine = create_engine("postgresql://user:[email protected]:5432/mydb") 

# pre-declare User for the 'user' table 
class User(Base): 
    __tablename__ = 'user' 

    # override schema elements like Columns 
    oname = Column('originalname', String) 

    # and a relationship. I name it 'weird' because in my database schema 
    # this relationship makes absolutely no sense, but it does demonstrate 
    # the point 
    weird = relationship("usergroup", 
         foreign_keys='usergroup.id', 
         primaryjoin='and_(usergroup.id==User.id)') 

Base.prepare(engine, reflect=True) 
session = Session(engine) 

# Test this by querying the User table and then following the relationship 
u = session.query(User).filter(User.oname == 'testuser').one() 
print (u.oname) 
for g in u1.weird: 
    print g.name 

를 (또 다른 예 포함) 문서 여기를 참조하십시오 : http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html?highlight=automap#specifying-classes-explicitly