小能豆

SQLAlchemy 默认日期时间

py

这是我的声明模型:

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'

如果我使用整数类型,我可以设置默认值。这是怎么回事?


阅读 21

收藏
2024-10-10

共1个答案

小能豆

出现此错误的原因是,与其他类型(例如)不同,DateTimeSQLAlchemy 中的列类型不直接支持参数。相反,您应该将 SQLAlchemy 的或关键字参数与构造函数一起使用。要为列指定默认值,您可以在构造函数中使用参数,而不是在其自身上使用参数。default``Integer``server_default``default``Column``DateTime``default``Column``DateTime

修复模型的方法如下:

修正模型:

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 = Column(DateTime, default=datetime.datetime.utcnow)  # Use default in Column

解释:

  1. Column(DateTime, default=datetime.datetime.utcnow)default关键字应该传递给Column,而不是。这告诉 SQLAlchemy在创建新记录时DateTime使用它作为默认值。datetime.datetime.utcnow()
  2. 发生错误的原因是DateTime类型本身不接受default参数。default参数是Column的 API 的一部分,而不是类型的 API。

这应该可以解决您的问题。现在模型将按预期工作,并且created_date当插入新记录而未指定时,列将默认为当前 UTC 时间created_date

2024-10-10