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