这是我的声明性模型:

import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = 'test'

    id = Column(Integer, primary_key=True)
    created_date = DateTime(default=datetime.datetime.utcnow)

然而,当我试图导入这个模块时,我得到这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "orm/models2.py", line 37, in <module>
    class Test(Base):
  File "orm/models2.py", line 41, in Test
    created_date = sqlalchemy.DateTime(default=datetime.datetime.utcnow)
TypeError: __init__() got an unexpected keyword argument 'default'

如果我使用Integer类型,我可以设置默认值。这是怎么呢


当前回答

注意,要使server_default=func.now()和func.now()工作:

Local_modified = Column(DateTime, server_default=func.now(), onupdate=func.now())

你需要在DDL表中设置DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

例如

create table test
(
    id int auto_increment
        primary key,
    source varchar(50) null,
    Local_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
collate=utf8mb4_bin;

否则,server_default= funcs .now(), onupdate= funcs .now()不会产生任何影响。

其他回答

可以在sqlalchemy中使用TIMESTAMP。

from sqlalchemy import TIMESTAMP, Table, MetaData, Column, ...

... ellipsis ...  
def function_name(self) -> Table:  
    return Table(  
        "table_name",  
        self._metadata,  
        ...,
        Column("date_time", TIMESTAMP),  
    )  
... ellipsis ...  

默认的关键字参数应该给Column对象。

例子:

Column(u'timestamp', TIMESTAMP(timezone=True), primary_key=False, nullable=False, default=time_now),

默认值可以是一个可调用对象,这里我像下面这样定义它。

from pytz import timezone
from datetime import datetime

UTC = timezone('UTC')

def time_now():
    return datetime.now(UTC)

您可能需要使用onupdate=datetime。现在,以便UPDATEs也改变last_updated字段。

对于python执行的函数,SQLAlchemy有两个默认值。

默认设置INSERT的值,只设置一次 onupdate也将值设置为UPDATE上的可调用结果。

Jeff Widman在他的回答中说,您需要为funct .utcnow()创建自己的UTC时间戳实现。

因为我不想自己实现它,我已经搜索并找到了一个python包,它已经完成了这项工作,并由许多人维护。

包名为spoqa/sqlalchemy-ut。

这个包的功能总结如下: 长话短说,UtcDateTime做:

只取有意识的datetime.datetime, 只返回感知的datetime。 永远不要接受或返回naive datetime.datetime, 确保数据库中的时间戳始终以UTC编码,并且 按照你期望的方式工作。

注意,要使server_default=func.now()和func.now()工作:

Local_modified = Column(DateTime, server_default=func.now(), onupdate=func.now())

你需要在DDL表中设置DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

例如

create table test
(
    id int auto_increment
        primary key,
    source varchar(50) null,
    Local_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
collate=utf8mb4_bin;

否则,server_default= funcs .now(), onupdate= funcs .now()不会产生任何影响。