如何通过 python 将 current_timestamp 插入 Postgres

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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】:

只需使用“现在”

http://www.postgresql.org/docs/8.0/static/datatype-datetime.html

【讨论】:

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 函数”。

以上是关于如何通过 python 将 current_timestamp 插入 Postgres的主要内容,如果未能解决你的问题,请参考以下文章

python的时间戳(微秒)

CURRENT_TIME()

shell获取时间精确到毫秒级别是哪个命令

tfit怎么设置时间

通过 shell 脚本执行合并时出错

NOIP2016提高A组模拟7.17寻找