列默认值持久保存到表中

时间:2011-03-18 12:06:14

标签: python sqlalchemy

我目前正在使用具有以下签名的Column

Column('my_column', DateTime, default=datetime.datetime.utcnow)

我试图找出如何更改它以便能够执行vanilla sql insert(INSERT INTO ...)而不是通过sqlalchemy。基本上我想知道如何在表上保留默认值而不会失去将列设置为当前utc时间的功能。

我使用的数据库是PostgreSQL。

2 个答案:

答案 0 :(得分:15)

SQLAlchemy有多种方法可以定义如何在插入/更新时设置值。您可以在documentation

中查看它们

您现在正在这样做的方式(为列定义default参数)只会影响SQLAlchemy何时生成插入语句。在这种情况下,它将调用可调用函数(在您的情况下,datetime.datetime.utcnow函数)并使用该值。

但是,如果你要运行直接的SQL代码,那么这个函数永远不会运行,因为你将完全绕过SQLAlchemy。

您可能想要做的是使用SQLAlchemy的Server Side Default能力。

请尝试使用此代码:

from sqlalchemy.sql import func
...
Column('my_column', DateTime, server_default=func.current_timestamp())

SQLAlchemy现在应生成一个表,该表将使数据库自动将当前日期插入my_column列。这样做的原因是现在默认情况下正在数据库侧使用,因此您不再需要SQLAlchemy作为默认值。

注意:我认为这实际上会插入本地时间(而不是UTC)。但是,希望你可以从这里找出其余部分。

答案 1 :(得分:2)

如果您想插入UTC时间,则必须执行以下操作:

from sqlalchemy import text
...
created = Column(DateTime,
                 server_default=text("(now() at time zone 'utc')"),
                 nullable=False)