Python 字段默认时间戳设置为表创建时间而不是行创建时间
使用SQLAlchemy、alembic和postgres,当尝试将列设置为行创建时间时,我最终得到的是一个字段,默认为表本身创建的时间,而不是行创建的时间 型号代码:Python 字段默认时间戳设置为表创建时间而不是行创建时间,python,postgresql,datetime,sqlalchemy,alembic,Python,Postgresql,Datetime,Sqlalchemy,Alembic,使用SQLAlchemy、alembic和postgres,当尝试将列设置为行创建时间时,我最终得到的是一个字段,默认为表本身创建的时间,而不是行创建的时间 型号代码: datetime = sa.Column(sa.DateTime, nullable=False, server_default=func.now()) Alembic将其翻译为: sa.Column('datetime', sa.DateTime(), server_default='now()', nullable=Fal
datetime = sa.Column(sa.DateTime, nullable=False, server_default=func.now())
Alembic将其翻译为:
sa.Column('datetime', sa.DateTime(), server_default='now()', nullable=False),
以及Postgres中的列:
datetime | timestamp without time zone | not null default '2013-06-24 11:28:14.930524'::timestamp without time zone
我应该怎么做,以使默认值为行创建时间?啊哈,算出了——如果要发送一些需要在DBMS本身上执行的SQL,似乎需要告诉server\u default命令:
from sqlalchemy import text
class Test(db.Model):
id = db.Column(db.Integer, primary_key=True)
created = db.Column(db.DateTime, server_default=text('now()'))
这将产生:
CREATE TABLE test (
id SERIAL NOT NULL,
created TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
PRIMARY KEY (id)
)
与其提交一个正确的答案,不如尝试
server\u default=func.now
而不是'server\u default=func.now()。@Doobeh:我想到了这一点,这是有道理的,因为它要传递的是一个函数而不是一个值,但调用函数似乎是SQLAlchemy中的一种方式。尝试这样做会触发以下错误:sqlalchemy.exc.ArgumentError:参数“arg”应为“”或“”或“”类型之一,got“”有点像是瞎猜的--我习惯于使用default=datetime。现在
来描述我的时间戳列。我发现(并测试)了一个使用server\u default
的解决方案,我将把它作为答案。谢谢,稍后我会尝试。但这只适用于Postgres,对吗?你只是告诉它‘嘿,不要处理这一点,只需将它添加到本专栏的SQL DDL中,不要问任何问题’。如果您的DBMS使用,比如说,OMG\u RIGHT\u NOW()
而不是NOW()
,那么您需要对其进行调整;例如,请参见