Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字段默认时间戳设置为表创建时间而不是行创建时间_Python_Postgresql_Datetime_Sqlalchemy_Alembic - Fatal编程技术网

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

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

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

型号代码:

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()
,那么您需要对其进行调整;例如,请参见