字段默认时间戳设置为表创建时间而不是行创建时间

Art*_*ler 4 python postgresql datetime sqlalchemy alembic

使用SQLAlchemy,alembic和postgres,在尝试将列设置为行创建时,我最终得到的是一个默认为创建表本身时的字段,而不是创建行的时间.

型号代码:

datetime = sa.Column(sa.DateTime, nullable=False, server_default=func.now())
Run Code Online (Sandbox Code Playgroud)

Alembic将其翻译为:

sa.Column('datetime', sa.DateTime(), server_default='now()', nullable=False),
Run Code Online (Sandbox Code Playgroud)

Postgres的专栏:

datetime  | timestamp without time zone | not null default '2013-06-24 11:28:14.930524'::timestamp without time zone
Run Code Online (Sandbox Code Playgroud)

我应该怎么做,默认是行创建时间?

Doo*_*beh 9

Aha,解决了 - 如果你要发送一些需要在DBMS上执行的SQL,你需要告诉server_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()'))
Run Code Online (Sandbox Code Playgroud)

这会产生:

CREATE TABLE test (
    id SERIAL NOT NULL, 
    created TIMESTAMP WITHOUT TIME ZONE DEFAULT now(), 
    PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)