如何在func.now()中使用SQLAlchemy ORM和SQLite获取小数秒

u3r8eeie  于 2023-06-23  发布在  SQLite
关注(0)|答案(1)|浏览(134)

简而言之:当我向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()返回一个带有小数秒的时间作为服务器端的默认时间戳?

li9yvcax

li9yvcax1#

使用包sqlalchemy_utc和函数utcnow()解决了这个问题。

相关问题