2011-02-09 3 views
3

저는 Python으로 응용 프로그램을 작성하고 있습니다. sqlalchemy-migrate을 사용하여 데이터베이스 스키마를 추적하고 있습니다. 두 개의 열 (id 및 name)이있는 user_category 테이블이 있습니다. user_category 테이블에 외래 키가있는 사용자 테이블을 만들려고합니다. 나는 'manage.py 테스트'를 실행하면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() 

내가 얻을 오류 : 당신은 당신의 "user_category"테이블이이 이름을 주장

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"의 정의가 대신 복사 붙여 넣기의 모든 :

+0

이렇게 간단합니다. 나는 user_category 테이블이 이전 변경 스크립트에 정의되어 있기 때문에 사용자 변경 스크립트에서 다시 정의 할 필요가 없다고 생각했습니다. 내가 틀렸어. 감사합니다. iElectric – hellsgate

5

가에 SQLAlchemy의 말할 수 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