postgresql 支持多种方言的实体

db2dz4w8  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(156)

我有一个为PostgreSQL方言编写的SQLAlchemy实体,它使用server_default=func.clock_timestamp()

row_created = sa.Column('row_created_', sa.DateTime(timezone=True), server_default=func.clock_timestamp(), nullable=False)

字符串
我还需要将它与SQLite一起使用,这会抛出一个错误:
sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)未知函数:clock_timestamp()
如何使用SQLAlchemy实现这一点?是否只为SQLite定义server_default?仅为特定方言有条件地添加整个列?以某种方式使clock_timestamp()为SQLite所知(我不关心函数会做什么,只要它不会失败)?

ne5o7dgx

ne5o7dgx1#

您可以用途:text("CURRENT_TIMESTAMP")服务器默认值:

class TimeStamp(Base):
    __tablename__ = "timestamp"

    id: Mapped[int] = mapped_column(
        primary_key=True,
    )

    datetime_with_tz: Mapped[datetime] = mapped_column(
        types.DateTime(timezone=True),
        server_default=text("CURRENT_TIMESTAMP"),
    )

字符串
这将使用以下SQL创建一个表:
PostgreSQL:

CREATE TABLE timestamp (
        id SERIAL NOT NULL,
        datetime_with_tz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY (id)
)


SQLite:

CREATE TABLE timestamp (
        id INTEGER NOT NULL,
        datetime_with_tz DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY (id)
)


如果必须在PostgreSQL上使用clock_timestamp(),可以将服务器默认值设置为:

server_default=text("CURRENT_TIMESTAMP") if use_sqlite else text("clock_timestamp()"),


波斯特格雷斯

CREATE TABLE timestamp (
        id SERIAL NOT NULL,
        datetime_with_tz TIMESTAMP WITH TIME ZONE DEFAULT clock_timestamp() NOT NULL,
        PRIMARY KEY (id)
)


方铅矿

CREATE TABLE timestamp (
        id INTEGER NOT NULL,
        datetime_with_tz DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY (id)
)


您也可以使用“default”使其在两个数据库上都工作。

timestamp_auto = Annotated[
    datetime.datetime,
    mapped_column(
        default=datetime.datetime.now,
    ),
]

class TimeStamp(Base):
    __tablename__ = "timestamp"

    id: Mapped[int] = mapped_column(
        primary_key=True,
    )

    datetime_with_tz: Mapped[timestamp_auto] = mapped_column(
        types.DateTime(timezone=True),
    )

hpxqektj

hpxqektj2#

我从我的一个同事那里得到了一个提示,我最终使用了它,它对postgresql和sqlite都很好用。

server_default=func.now()

字符串
afaik它与func.clock_timestamp()相同,但clock_timestamp()是特定于postgresql的,并且now()由几个DB支持。

相关问题