Bra*_*rke 140 python sqlalchemy date
这是我的声明模型:
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)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试导入此模块时,我收到此错误:
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'
Run Code Online (Sandbox Code Playgroud)
如果我使用Integer类型,我可以设置默认值.这是怎么回事?
Jef*_*man 309
为了理智,您可能希望datetimes由数据库服务器而不是应用程序服务器计算所有数据.计算应用程序中的时间戳可能会导致问题,因为网络延迟是可变的,客户端遇到稍微不同的时钟漂移,而不同的编程语言偶尔会略微不同地计算时间.
SQLAlchemy允许您通过传递func.now()或func.current_timestamp()(它们是彼此的别名)来执行此操作,这告诉DB计算时间戳本身.
server_default此外,对于您已经告诉数据库计算值的默认值,通常最好使用server_default而不是default.这告诉SQLAlchemy将默认值作为CREATE TABLE语句的一部分传递.
例如,如果您针对此表编写临时脚本,则使用server_default意味着您无需担心手动向脚本添加时间戳调用 - 数据库将自动设置它.
onupdate/server_onupdateSQLAlchemy还支持onupdate以便在更新行时随时插入新的时间戳.同样,最好告诉DB计算时间戳本身:
from sqlalchemy.sql import func
time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())
Run Code Online (Sandbox Code Playgroud)
有一个server_onupdate参数,但不像server_default,它实际上没有设置任何服务器端.它只是告诉SQLalchemy数据库将在更新发生时更改列(可能是您在列上创建了一个触发器),因此SQLAlchemy将要求返回值,以便它可以更新相应的对象.
您可能会惊讶地发现,如果您在单个事务中进行了大量更改,则它们都具有相同的时间戳.那是因为SQL标准指定CURRENT_TIMESTAMP根据事务的开始返回值.
PostgreSQL提供非SQL标准statement_timestamp()和clock_timestamp()它做交易内改变.文档:https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT
如果要使用UTC时间戳,SQLAlchemy文档中func.utcnow()提供了实现的存根.您需要自己提供适当的驱动程序特定功能.
Pea*_*oto 163
DateTime没有默认密钥作为输入.默认键应该是Column函数的输入.试试这个:
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)
Run Code Online (Sandbox Code Playgroud)
小智 51
您还可以使用sqlalchemy内置函数作为默认DateTime
from sqlalchemy.sql import func
DT = Column(DateTime(timezone=True), default=func.now())
Run Code Online (Sandbox Code Playgroud)
小智 15
使用default参数datetime.now:
from sqlalchemy import Column, Integer, DateTime
from datetime import datetime
class Test(Base):
__tablename__ = 'test'
id = Column(Integer, primary_key=True)
created_at = Column(DateTime, default=datetime.now)
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
Run Code Online (Sandbox Code Playgroud)
use*_*572 13
您可能希望使用,onupdate=datetime.now以便 UPDATE 也更改该last_updated字段。
SQLAlchemy 对 python 执行的函数有两个默认值。
default 在 INSERT 上设置值,仅一次onupdate也将值设置为UPDATE上的可调用结果。的default关键字参数应被给予Column对象.
例:
Column(u'timestamp', TIMESTAMP(timezone=True), primary_key=False, nullable=False, default=time_now),
Run Code Online (Sandbox Code Playgroud)
默认值可以是可调用的,这里我定义如下.
from pytz import timezone
from datetime import datetime
UTC = timezone('UTC')
def time_now():
return datetime.now(UTC)
Run Code Online (Sandbox Code Playgroud)