0

我在 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列,但我不确定最好的方法。

4

1 回答 1

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)
于 2013-03-16T15:15:13.873 回答