2013-03-16 3 views
0

Я использую SQLAlcemy в приложении Flask, чтобы перенести старую базу данных 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

Мне очень жаль, что это моя вина не используя мой код дословно. Я фактически использую ORM с 'declarative_base'. Я скорректировал свой пример, но, я думаю, можно с уверенностью предположить, что комманда 'ForeignKey' /' primary_key' будет работать? – Wil

+0

Да, вы правы в использовании 'ForeignKey'. Я также обновил свой ответ. –

+0

и как я могу добавить новую запись EntryData? Я узнаю старый элемент entry_id, но его нельзя повторно использовать в новом, поскольку он автоматически увеличивается. Я надеялся, что это будет что-то вроде титул = ChannelTitle ({ 'Название': 'Мой титул'}) данных = ChannelData ({ 'тело': 'Мое тело, entry_id = title.entry_id}) db_session .add (заголовок) db_session.add (данные) db_session.commit() – Wil

Смежные вопросы