2011-02-09 8 views
3

私はPythonでアプリケーションを構築しています。私はsqlalchemy-migrateを使用してデータベーススキーマを追跡しています。私は、IDと名前の2つの列を持つテーブルuser_categoryを持っています。 user_categoryテーブルへの外部キーを持つuserテーブルを作成しようとしています。次のようにユーザーのテーブルを作成するための私の変更スクリプトは次のとおりです。SQLAlchemy-Migrateを使用した外部キ​​ー制約のテーブル作成エラー

from sqlalchemy import * 
from migrate import * 
from migrate.changeset import * 

meta = MetaData() 
user_category = Table('user_category', meta) 

user = Table('user', meta, 
    Column('id', Integer, primary_key=True), 
    Column('email', String(255)), 
    Column('first_name', String(40)), 
    Column('surname', String(40)), 
    Column('password', String(255)), 
    Column('user_category', Integer, ForeignKey("user_category.id")), 
) 

def upgrade(migrate_engine): 
    # Upgrade operations go here. Don't create your own engine; bind migrate_engine 
    # to your metadata 
    meta.bind = migrate_engine 
    user.create() 

def downgrade(migrate_engine): 
    # Operations to reverse the above upgrade go here. 
    meta.bind = migrate_engine 
    user.drop() 

私は「manage.pyテスト」を実行すると、私が取得し、エラー:

sqlalchemy.exc.NoReferencedColumnError: Could not create ForeignKey 'user_catego 
ry.id' on table 'user': table 'user_category' has no column named 'id' 

答えて

2

あなたはあなたの「user_category」テーブルに名前があると主張し、 id。 「user_category」の定義は、自動ロードデータベースからテーブル構造をしSQLAlchemyのを伝えることが可能である何のすべて:)

+0

これは簡単です。 user_categoryテーブルが以前の変更スクリプトで定義されているため、ユーザー変更スクリプトで再定義する必要はありませんでした。私は間違っていた。おかげでiElectric – hellsgate

5

で列の代わりにコピー&ペーストuser_categoryテーブルの定義が含まれていません:

from sqlalchemy import * 
from migrate import * 
from migrate.changeset import * 

meta = MetaData() 

user = Table('user', meta, 
    Column('id', Integer, primary_key=True), 
    Column('email', String(255)), 
    Column('first_name', String(40)), 
    Column('surname', String(40)), 
    Column('password', String(255)), 
    Column('user_category', Integer, ForeignKey("user_category.id")), 
) 

def upgrade(migrate_engine): 
    _t = sa.Table('user_category', meta, autoload=True) 
    meta.bind = migrate_engine 
    user.create() 

遅い答えに申し訳ありません:

+0

有用な答えはいつも遅くても歓迎です:)ありがとう! – hellsgate

+1

私はmeta.bindの割り当ての後にテーブルを定義する必要があります。その後、それは動作します。ありがとう – farincz

関連する問題