【问题标题】:Column default value persisted to the table列默认值持久化到表中
【发布时间】:2014-03-16 03:06:55
【问题描述】:

我目前正在使用具有以下签名的Column

Column('my_column', DateTime, default=datetime.datetime.utcnow)

我正在尝试弄清楚如何更改它以便能够执行普通 sql 插入 (INSERT INTO ...) 而不是通过 sqlalchemy。基本上我想知道如何在不丢失将列设置为当前UTC时间的功能的情况下将默认值保留在表上。

我使用的数据库是 PostgreSQL。

【问题讨论】:

  • 不确定我理解你的意思。您是自己编写普通 SQL 语句并希望 PostgreSQL 生成当前时间作为列的初始值,还是使用 SQLAlchemy 生成 INSERT 语句并希望 SQLAlchemy 将重用 utcnow 方法来确定使用的数据?
  • 我只使用 SQLAlchemy 为各种任务创建表和普通 SQL,因为我在大容量数据环境中使用它并且使用 ORM 很慢。

标签: python sqlalchemy


【解决方案1】:

有多种方法可以让 SQLAlchemy 定义如何在插入/更新时设置值。你可以在documentation查看。

您现在的操作方式(为列定义 default 参数)只会影响 SQLAlchemy 生成插入语句的时间。在这种情况下,它将调用可调用函数(在您的情况下为 datetime.datetime.utcnow 函数)并使用该值。

但是,如果您要直接运行 SQL 代码,则永远不会运行此函数,因为您将完全绕过 SQLAlchemy。

您可能想要做的是使用 SQLAlchemy 的Server Side Default 功能。

试试这个代码:

from sqlalchemy.sql import func
...
Column('my_column', DateTime, server_default=func.current_timestamp())

SQLAlchemy 现在应该生成一个表,该表将使数据库自动将当前日期插入my_column 列。这样做的原因是现在在 database 端使用默认值,因此您不再需要 SQLAlchemy 作为默认值。

注意:我认为这实际上会插入本地时间(而不是 UTC)。不过,希望您能从这里找出其余的。

【讨论】:

    【解决方案2】:

    如果您想插入 UTC 时间,您必须执行以下操作:

    from sqlalchemy import text
    ...
    created = Column(DateTime,
                     server_default=text("(now() at time zone 'utc')"),
                     nullable=False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2019-06-01
      • 2014-12-28
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多