SQLAlchemy两个同名的主键也是外来的

时间:2013-03-16 11:15:19

标签: python sqlalchemy flask-sqlalchemy

我在Flask应用程序中使用SQLAlcemy将旧的MySQL数据库迁移到新的数据库,同时执行一些清理工作。我没有控制目标上的模式,因此我限制了他们令人沮丧的模式和声明列名和关系的方式。

我的模特看起来如此:

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列,我不确定最佳方法。

1 个答案:

答案 0 :(得分: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)