既存のテーブル列に外部キー制約を追加しようとしているチェンジセット スクリプトがあります。次のようになります。
from sqlalchemy import *
from migrate import *
import datetime
metadata = MetaData()
registrations = Table('registrations', metadata,
Column('id', Integer(), primary_key=True),
Column('date', DateTime(), nullable=False, index=True,
default=datetime.datetime.now),
Column('device_id', String(255), nullable=False, index=True)
)
devices = Table('devices', metadata,
Column('id', String(255), primary_key=True),
Column('user_id', Integer(), ForeignKey('users.id'), nullable=False,
index=True),
Column('created', DateTime(), nullable=False, index=True,
default=datetime.datetime.now)
)
cons = ForeignKeyConstraint([registrations.c.device_id], [devices.c.id])
def upgrade(migrate_engine):
metadata.bind = migrate_engine
cons.create()
def downgrade(migrate_engine):
metadata.bind = migrate_engine
cons.drop()
変更をテストすると、SQLAlchemy は次のように文句を言います。
sqlalchemy.exc.OperationalError: (OperationalError) no such table: registrations 'INSERT INTO registrations SELECT * from migration_tmp' ()
スキーマを変更するためにテーブルスワップを行っているようです。他の誰かがこれに遭遇したことがありますか?私は何か間違ったことをしていますか?または回避策はありますか?
編集:私は sqlite でこれをテストしています。ここに私のmanage.pyがあります:
from migrate.versioning.shell import main
main(url='sqlite:///development.db', debug='False', repository='migrations')
mysql ダイアレクトの使用はうまくいくようです。sqlite に分離できます。