2014-09-21 73 views
7

我是新來的sqlalchemy。我按照教程創建從一個MySQL關係的現有數據庫的自動映射數據庫是否可以在通過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映射到table1的一列。但是當我嘗試使用查詢並加入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

相關問題