在单个数据库上使用flask-migrate创建具有不同架构的多个表

时间:2020-06-14 22:44:53

标签: python postgresql flask sqlalchemy flask-migrate

我正在使用flask-migrate处理表的创建和维护。我有多个具有不同架构的表。

 class A(db.model):
      __tablename__ = 'A'
      __table_args__ = {'schema': 'public'}
      # rest of data

 class B(db.model):
      __tablename__ = 'B'
      __table_args__ = {'schema': 'schema_b'}
      # rest of data    

因此,当我运行flask db initflask db migrate时,会在迁移文件夹中创建一个迁移脚本。但是,当我运行flask db upgrade在数据库中添加表时,它向我显示错误

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidSchemaName) schema "schema_b.B" does not exist

在搜索该问题时,我发现了include_schemasmigrate using different schema,在这两部分中都提到在{{1}的include_schemas=True中使用configure }}。另外,答案中的解决方案中提到的链接具有无效的链接,因此这对我来说没有什么编程作用。

我进行了相应的更改。然后我正在运行migration/env.py,它正在检测具有所有模式的所有表。但在我运行flask db migrate

flask db upgrate

错误再次出现。

请帮助我,如何使用sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidSchemaName) schema "schema_b.B" does not exist解决此问题。创建一个表,我有一个运行良好的SQL命令。

1 个答案:

答案 0 :(得分:1)

include_schemas=True选项使Alembic在非默认模式中查找表,但是在将它们添加到模型定义中时无法生成新模式。

在这种情况下,您需要做的是运行flask db migrate来生成迁移,然后打开生成的迁移脚本并在创建新表之前添加架构创建。例如,在您问题的示例中,B模型的迁移或多或少是这样生成的:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('schema_b.B',
        # ...
    )
    # ### end Alembic commands ###

因此,您需要在表创建上方添加模式创建语句,以便在创建表时该模式已经存在:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.execute('create schema schema_b')  # <--- add this
    op.create_table('schema_b.B',
        # ...
    )
    # ### end Alembic commands ###

然后为了保持一致性,还将架构放在降级路径上:

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('schema_b.B')
    op.execute('drop schema schema_b')  # <--- add this
    # ### end Alembic commands ###