我目前正在使用具有以下签名的Column
:
Column('my_column', DateTime, default=datetime.datetime.utcnow)
我试图找出如何更改它以便能够执行vanilla sql insert(INSERT INTO ...
)而不是通过sqlalchemy。基本上我想知道如何在表上保留默认值而不会失去将列设置为当前utc时间的功能。
我使用的数据库是PostgreSQL。
答案 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)