【问题标题】:How to insert current_timestamp into Postgres via python如何通过 python 将 current_timestamp 插入 Postgres
【发布时间】:2011-08-26 11:14:59
【问题描述】:

我需要在PG中插入行,其中一个字段是带有时间戳的日期和时间,这是事件发生的时间,所以我不能使用 --> 插入时Postgres的current_timestamp函数,那怎么能然后,我将之前收集的时间和日期以与 current_timestamp 在该时间点创建的格式相同的格式插入到 pg 行中。

【问题讨论】:

    标签: python postgresql datetime


    【解决方案1】:

    时间戳没有“格式”。

    处理时间戳的推荐方法是使用 PreparedStatement,您只需在 SQL 中传递一个占位符并通过编程语言的 API 传递一个“真实”对象。由于我不了解 Python,我不知道它是否支持 PreparedStatements 以及它的语法。

    如果您想将时间戳文字放入生成的 SQL 中,则在指定值时需要遵循一些格式规则(文字确实有格式)。

    Ivan 的方法会起作用,虽然我不能 100% 确定它是否取决于 PostgreSQL 服务器的配置。

    指定时间戳文字的配置(和语言)独立解决方案是 ANSI SQL 标准:

     INSERT INTO some_table 
     (ts_column) 
     VALUES 
     (TIMESTAMP '2011-05-16 15:36:38');
    

    是的,这是关键字 TIMESTAMP 后跟 ISO 样式格式的时间戳(TIMESTAMP 关键字定义了该格式)

    另一种解决方案是使用to_timestamp() 函数,您可以在其中指定输入文字的格式。

     INSERT INTO some_table 
     (ts_column) 
     VALUES 
     (to_timestamp('16-05-2011 15:36:38', 'dd-mm-yyyy hh24:mi:ss'));
    

    【讨论】:

    • 谢谢 ->format('Y-m-d H:i:s');正在为我工​​作。
    • 您也可以在 to_timestamp 中使用ms 来节省毫秒精度。
    • 谢谢!使用TIMESTAMP 为我节省了一大堆时间,无需将 Python 中的时区附加到我的所有日​​期时间值。
    【解决方案2】:

    如果您使用 psycopg2(可能还有其他一些客户端库),您可以简单地将 Python datetime 对象作为 parameter 传递给 SQL 查询:

    from datetime import datetime, timezone
    
    dt = datetime.now(timezone.utc)
    cur.execute('INSERT INTO mytable (mycol) VALUES (%s)', (dt,))
    

    (这里假设在数据库端使用timestamp with time zone 类型。)

    列出了更多可以适应 SQL 的 Python 类型(并在执行查询时作为 Python 对象返回)here

    【讨论】:

      【解决方案3】:

      【讨论】:

      • nowcurrent_timestamp 完全相同
      • 完全一样,只是不抛出错误。
      • OP 明确询问如何通过 Python 执行此操作。
      • @eugeney 你是对的。但似乎有些人仍然觉得它很有帮助。这就是我将答案保留在这里的原因。
      【解决方案4】:

      几乎可以接受任何合理格式的日期和时间输入, 包括 ISO 8601、SQL 兼容、传统 POSTGRES 等。 对于某些格式,日期输入中的月、日和年的顺序是 模棱两可,并且支持指定预期的排序 这些字段。

      换句话说:只要写任何东西就可以了。

      或检查this table 的所有明确格式。

      【讨论】:

        【解决方案5】:

        当然,只需为该时间戳列传递一个字符串值,格式为:'2011-05-16 15:36:38'(您也可以在此处附加一个时区,例如'PST')。 PostgreSQL 会自动将字符串转换为时间戳。见http://www.postgresql.org/docs/9.0/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT

        【讨论】:

          【解决方案6】:
          from datetime import datetime as dt
          

          然后在您的代码中使用它:

          cur.execute('INSERT INTO my_table (dt_col) VALUES (%s)', (dt.now(),))
          

          【讨论】:

            【解决方案7】:

            随便用

            现在()

            CURRENT_TIMESTAMP

            我更喜欢后者,因为我喜欢没有额外的括号,但这只是个人喜好。

            【讨论】:

            • 问题中明确指出,“插入时我不能使用 --> Postgres 的 current_timestamp 函数”。
            猜你喜欢
            • 2017-04-23
            • 2023-03-26
            • 1970-01-01
            • 1970-01-01
            • 2021-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-17
            相关资源
            最近更新 更多