如何通过 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
【讨论】:
now
与current_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的主要内容,如果未能解决你的问题,请参考以下文章