Postgres 和 alembic - 假设 SERIAL 序列

Posted

技术标签:

【中文标题】Postgres 和 alembic - 假设 SERIAL 序列【英文标题】:Postgres and alembic - Assuming SERIAL sequence 【发布时间】:2019-11-16 14:32:36 【问题描述】:

我有一个 postgres 数据库,我通过 SQLAlchemy 和 alembic(用于迁移)进行管理。通过 alembic 创建数据库迁移时,我在控制台中收到以下信息。

INFO  [alembic.ddl.postgresql] Detected sequence named 'my_table_name_id_seq' as owned by integer column 'my_table_name(id)', assuming SERIAL and omitting

我的模型看起来像

class CopyJob(db.Model):
    __tablename__ = "my_table_name"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

我将上述内容解释为警告。为我的每个表生成一行。我有两个问题:

收到上述警告时我做错了什么 我应该修复/明确设置什么,以使其消失。迁移过于冗长。

谢谢!

【问题讨论】:

您已将 Alembic 日志记录级别设置为 INFO。所以,这甚至不是警告。这只是信息。如果您不想看到 INFO 行,请将您的日志记录级别更改为 WARN。它可能在 alembic.ini 配置文件的 logger_alembic 部分中。 alembic.sqlalchemy.org/en/latest/… 这是一种可能性,但我更喜欢保持 INFO 日志记录级别并仅处理这些特定行。你认为这可能吗? 您应该可以使用 logging.Filter (docs.python.org/2/library/logging.html#filter-objects) 来完成。但是假设您使用命令行 alembic 脚本来启动 alembic,将过滤器添加到其日志记录处理程序中,您将无法通过配置来完成。 logging.config.fileConfig 不支持过滤器,这是 alembic 正在使用的。您需要以编程方式启动 alembic,以便您可以自己设置记录器。另一种选择是修补 PostgresqlImpl.autogen_col_reflect 方法中的日志调用。 【参考方案1】:

在深入研究 alembic 代码后,它看起来不像是警告。 Alembic 只是通知它检查的序列结果是一个 SERIAL。因此,试图以某种方式解决问题是没有意义的。如果该消息困扰您,您可以按照 cmets 中的建议将日志级别提高到 WARNING,否则,似乎没有解决方法。

【讨论】:

这说明会发生什么...当您将 serial 作为列类型时,PG 创建整数列,序列名为 - table_column_seq - 并将 table 标记为序列的所有者。可能开发人员决定通过向您展示它来稍微灵活一点......;)

以上是关于Postgres 和 alembic - 假设 SERIAL 序列的主要内容,如果未能解决你的问题,请参考以下文章

flask使用alembic,进行数据库结构管理,升级,加表,加项

alembic常用命令和经典错误解决办法

Postgres中用户定义的连接功能?

Alembic 自动生成空迁移文件

Alembic基本使用

使用alembic进行数据库版本管理