2013-03-16 75 views
0

我在Flask應用程序中使用SQLAlcemy將舊的MySQL數據庫遷移到新的MySQL數據庫,同時執行一些清理和此類途中。我不控制目標上的模式,因此我限制了他們令人沮喪的模式和聲明列名和關係的方式。因此SQLAlchemy兩個相同名稱的主鍵也是外國的

我的模型看起來:

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

class EntryTitle(Base): 
    __tablename__ = 'entry_title' 

    entry_id = Column('entry_id', Integer, primary_key=True) 
    title = Column('title', String(155)) 

class EntryData(Base): 
    __tablename__ = 'entry_data' 

    entry_id = Column('entry_id', Integer, primary_key=True) 
    body = Column('body', String(255)) 

我需要第二個涉及到第一,加入了對entry_id列,我不確定要做到這一點的最好辦法。

回答

2

您需要定義主鍵作爲外鍵,然後SQLAlchemy的將自己弄清楚的關係,而這樣做加盟:

class EntryTitle(Base): 
    __tablename__ = 'entry_title' 
    entry_id = Column('entry_id', Integer, primary_key=True) 
    title = Column('title', String(155)) 
    # Assuming this is a one-to-one relationship, so setting uselist to False. 
    entry_data = relationship('EntryData', backref='entry_title', 
           uselist=False) 

class EntryData(Base): 
    __tablename__ = 'entry_data' 
    # Simply define this primary key as a foreign key to entry_title table. 
    entry_id = Column('entry_id', Integer, ForeignKey('entry_title.entry_id'), 
         primary_key=True) 
    body = Column('body', String(255)) 

# Add new objects to a session. 
entry_title = EntryTitle(title='Foo')            
entry_title.entry_data = EntryData(body='Bar')         
session.add(entry_title)               
session.commit() 

# Query whole models. 
q1 = session.query(EntryTitle, EntryData).join(EntryData) 
# Or just the columns you need. 
q2 = session.query(EntryTitle.title, EntryData.body).\ 
    join(EntryData).\ 
    filter(EntryTitle.entry_id == 42) 
+0

對不起,這是我的錯,不使用我的代碼逐字。我實際上使用帶'declarative_base'的ORM。我已經調整了我的例子,但我猜可以假設'ForeignKey' /'primary_key'組合仍然可以工作嗎? – Wil 2013-03-17 10:28:17

+0

是的,您正確使用'ForeignKey'。我也更新了我的答案。 – 2013-03-17 11:32:51

+0

以及如何添加新的EntryData?我會知道舊的entry_id,但它不能在新版本中重新使用,因爲它是自動遞增的。我希望它會像 title = ChannelTitle({'title':'My title'}) data = ChannelData({'body':'My body',entry_id = title.entry_id}) db_session .add(title) db_session.add(data) db_session.commit() – Wil 2013-03-18 11:46:23