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