Alembic迁移:如何在Alembic的alter_column函数中设置server_onupdate

Ele*_*tro 5 python postgresql sqlalchemy alembic

我正在尝试使用Alembic更改PostgreSQL中的表列,但是我不知道如何执行所需的更新以应用SQLAlchemy的server_onupdate属性。

该列是:

changed = Column(ArrowType(timezone=True), server_default=utcnow(), primary_key=True)
Run Code Online (Sandbox Code Playgroud)

我正在使用SQLAlchemy_utils包中的Arrowtype列类型(这不是问题)。

我的意图是创建这样的东西:

changed = Column(ArrowType(timezone=True), **server_onupdate=utcnow()**, primary_key=True)
Run Code Online (Sandbox Code Playgroud)

但是使用Alembic函数:alter_column

在文档中,仅引用server_default属性,而没有关于server_onupdate的引用

有没有办法做到这一点?

谢谢

inf*_*fra 1

不幸的是,Alembic 不提供在代码中进行更改的逻辑,server_onupdate但它提供更改的逻辑。文档中有以下设置 MySQL 的技巧:alter_columnserver_defaultON UPDATE

server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
Run Code Online (Sandbox Code Playgroud)

因此,如果您更改列定义,则可以实现。但是,如果它看起来太 hack 了,那么总是可以在 Alembic 中编写直接 SQL 指令。

op.execute('ALTER TABLE mytable ALTER COLUMN ....')
Run Code Online (Sandbox Code Playgroud)

更新:

刚刚注意到 postgresql 标签.. postgresql 中没有ON UPDATE列(仅适用于外键),因此设置server_onupdate不会执行任何操作。要获得相同的逻辑,您需要创建数据库端触发器或使用 ORM 端onupdate或事件。