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))

その列に結合された最初の列に 2 番目の列を関連付ける必要がありますが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 に答える