`Ошибка программирования, таблица не существует` с использованием перегонного куба bulk_insert

Я пытаюсь использовать перегонный куб для создания новой таблицы и использовать bulk_insert для добавления новых записей. Я использую bulk_insert пример здесь. Вот код, который я запускаю:

from alembic import op
import sqlalchemy as sa
from sqlalchemy.sql import table, column

def upgrade():
    status_reviews = table(
        'status',
        column('status_order', sa.Integer),
        column('status_name', sa.String(64))
        )

    op.bulk_insert(status_reviews,
        [
            {'status_order': 1, 'status_name': 'New'},
            {'status_order': 2, 'status_name': 'Reviewed'},
            {'status_order': 3, 'status_name': 'Design'},
        ]
    )

Я получаю следующую ошибку при попытке запустить его:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) (1146, u"Table 'partsdb.review_status_definitions' doesn't exist") 'INSERT INTO review_status_definitions (status_order, status_name) VALUES (%s, %s)' ((1, 'New'), (2, 'Reviewed'), (3, 'Design')

Я знаю, что базовый алембик работает, потому что я могу добавлять другие таблицы (без ввода записей). Когда я проверяю базу данных в MySQL Workbench, таблица status вообще не отображается, что заставляет меня думать, что на самом деле происходит сбой команды создания таблицы.


person realityinabox    schedule 11.11.2014    source источник


Ответы (1)


Я думаю, что вы используете неправильный синтаксис для создания таблицы с помощью перегонного куба. Вы определяете там схему таблицы, как бы вы настроили ее в коде Python (и создали с помощью db.create_all()), но вы создаете таблицы в перегонном кубе, используя другой синтаксис:

def upgrade():
    op.create_table('categories',
      sa.Column('id', sa.Integer(), primary_key=True),
      sa.Column('name', sa.String(length=100), nullable=False),
      sa.Column('modified', sa.DateTime(), nullable=True),
      sa.Column('created', sa.DateTime(), nullable=True),
    )
    for category in ["example", "another example"]:
      op.execute("INSERT INTO categories (name, modified, created) VALUES ('%s', '%s', '%s')" % (category, datetime.utcnow(), datetime.utcnow()))

В Alembic есть функция автогенерации, которая считывает схему вашей таблицы, определенную в Python, сравнивает ее с базой данных и выдает для вас файл обновления. Звучит так, как будто это может быть излишним для вас сейчас, но об этом полезно знать.

person Rachel Sanders    schedule 11.11.2014
comment
В примере из перегонного куба и других здесь, в stackexchange 15769163#15769163">ссылка, мне нужно создать таблицу с помощью sqlalchemy, а затем заполнить ее с помощью перегонного куба. Когда я пытаюсь bulk_insert использовать таблицу, созданную с помощью перегонного куба, я получаю AttributeError: 'NoneType' object has no attribute '_autoincrement_column' ошибки - person realityinabox; 11.11.2014