【问题标题】:create multiple table with different schema using flask-migrate on a single database在单个数据库上使用 flask-migrate 创建具有不同架构的多个表
【发布时间】:2020-10-04 07:46:23
【问题描述】:

我正在使用 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,在这两个部分都提到在configure 中使用include_schemas=Truemigration/env.py 中。此外,答案中的解决方案中提到的链接具有无效链接,所以这对我来说变得很少编程。

我已经做出了相应的改变。然后我正在运行flask db migrate,它正在检测具有所有模式的所有表。但是当我正在运行flask db upgrate

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

错误再次出现。

帮助我,如何使用flask migrate 解决这个问题。要创建一个表,我有一个运行良好的 SQL 命令。

【问题讨论】:

  • 架构是否存在于您的数据库中?我已经有一段时间没有这样做了,但我相信架构需要手动创建。您只需要添加一个在迁移中创建架构的 SQL 操作。
  • @Miguel,没有架构不存在。我以为它会自动处理,让我测试一下。感谢您的信息
  • @Miguel 感谢这项工作。请在答案中添加您的建议,以便将来有所帮助
  • 太棒了。答案已添加。谢谢。

标签: python postgresql flask sqlalchemy flask-migrate


【解决方案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 ###

所以需要在创建表的上面加上schema创建语句,这样创建表时schema就已经存在了:

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 ###

【讨论】:

  • 谢谢,现在图片更清晰,而不是手动添加通过代码添加。
猜你喜欢
  • 2018-09-15
  • 2013-10-19
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多