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

7d7tgy0s  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(1)|浏览(182)

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

changed = Column(ArrowType(timezone=True), server_default=utcnow(), primary_key=True)

我使用的是SQLAlchemy_utils包中的Arrowtype列类型(这不是问题)。
我的意图是创建这样的内容:

changed = Column(ArrowType(timezone=True), **server_onupdate=utcnow()**, primary_key=True)

但使用Alembic函数:更改列
在文档中,只有对 server_default 属性的引用,而没有关于 server_onupdate 的任何内容
有没有办法做到这一点?
谢谢

j7dteeu8

j7dteeu81#

不幸的是,Alembic没有提供在alter_column中修改server_onupdate的逻辑(参见代码),但是它提供了修改server_default的逻辑。文档中有以下设置MySQL ON UPDATE的技巧:

server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")

如果你改变列的定义,这是可以实现的,但是,如果它看起来太像黑客了,那么总是可以用Alembic写一个直接的SQL指令。

op.execute('ALTER TABLE mytable ALTER COLUMN ....')

更新:
我刚刚注意到postgresql标记.. postgresql中的列没有ON UPDATE(仅用于外键),因此设置server_onupdate将不起任何作用。要获得相同的逻辑,您需要创建一个数据库端触发器或使用ORM端onupdate或事件。

相关问题