简而言之:当我向sqlite中的一个表添加条目时,主键是默认的时间戳,我会得到一个“UNIQUE constraint failed”错误,因为时间戳没有小数秒。如何让SQLAlchemy在www.example.com()中使用小数秒func.now
下面是一个例子:
import datetime as dt
import time
from sqlalchemy import create_engine
from sqlalchemy import func, Column, DateTime, Time
from sqlalchemy.engine.base import Connection, Engine
from sqlalchemy.orm import Session
from sqlalchemy.orm import DeclarativeBase, Mapped, MappedAsDataclass, mapped_column
class Base(DeclarativeBase):
"""Base class for the database."""
class Table1(Base, MappedAsDataclass):
"""Table."""
__tablename__ = "dummy table"
timestamp: Mapped[dt.datetime] = mapped_column(primary_key=True,
autoincrement=False,
server_default=func.now())
data: Mapped[int] = mapped_column(nullable = True)
if __name__ == "__main__":
engine: Engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
record1 = Table1(data=1)
record2 = Table1(data=2)
with Session(engine) as session:
session.add(record1)
session.commit()
# time.sleep(2)
session.add(record2)
session.commit()
基于SQLAlchemy SQLite日期时间文档:
默认的字符串存储格式为:
"%(year)04d-%(month)02d-%(day)02d %(hour)02d:%(minute)02d:%(second)02d.%(microsecond)06d"
例如:
2021-03-15 12:05:57.105542
我想我会得到分数秒。相反,上面代码的输出(time.sleep(2)
没有注解掉)是:
2023-06-14 12:32:17 1
2023-06-14 12:32:19 2
没有小数秒。
在上面的同一页上,我看到有一种自定义格式的方法,但我不太明白如何将新的DATETIME对象转换为sqlite方言。
那么:我如何让func.now()返回一个带有小数秒的时间作为服务器端的默认时间戳?
1条答案
按热度按时间li9yvcax1#
使用包sqlalchemy_utc和函数utcnow()解决了这个问题。