使用alembic bulk_insert编程错误,表不存在

时间:2014-11-11 19:08:57

标签: python alembic

我正在尝试使用alembic创建一个新表并使用bulk_insert添加新条目。我正在关注bulk_insert example here.以下是我正在运行的代码:

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

我知道基本的alembic工作正在运行,因为我能够添加其他表(不提供条目)。当我在MySQL Workbench中检查数据库时,status表根本没有出现,这让我觉得它实际上在create table命令上失败了。

1 个答案:

答案 0 :(得分:0)

我认为您使用错误的语法来使用alembic创建表。您在那里定义了表模式,这是您在Python代码中设置它的方式(并通过db.create_all()创建),但您使用不同的语法在alembic中创建表:

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中定义的表模式,将其与数据库区分开来并为您吐出升级文件。听起来现在对你来说可能有点过头了,但是了解它真有好处。