Ошибка создания таблицы с ограничением внешнего ключа с помощью SQLAlchemy-Migrate - PullRequest
3 голосов
/ 10 февраля 2011

Я создаю приложение на python. Я использую sqlalchemy-migrate для отслеживания схемы моей базы данных. У меня есть таблица user_category, которая имеет два столбца: идентификатор и имя. Я пытаюсь создать пользовательскую таблицу с внешним ключом для таблицы user_category. Мой сценарий изменения для создания пользовательской таблицы выглядит следующим образом:

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 test», я получаю сообщение об ошибке:

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

Ответы [ 2 ]

5 голосов
/ 14 июня 2012

Вместо копирования-вставки определения таблицы user_category можно указать SQLAlchemy автоматически загрузить структуру таблицы из базы данных:

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

Извините за поздний ответ:)

2 голосов
/ 13 февраля 2011

Вы утверждаете, что ваша таблица "user_category" имеет имя и идентификатор. Определение «user_category» вообще не содержит столбцов:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...