如何通过Python将当前时间戳插入Postgres

74 投票
8 回答
223377 浏览
提问于 2025-04-16 17:44

我需要在PG(PostgreSQL数据库)中插入一些行,其中有一个字段是日期和时间,带有时间戳。这是事件发生的时间,所以在插入时我不能使用Postgres的current_timestamp函数。那么,我该如何将之前收集的时间和日期,以与current_timestamp在那个时间点创建的格式相同的方式,插入到PG的行中呢?

8 个回答

88

如果你使用 psycopg2 (还有可能是其他一些客户端库),你可以直接把一个 Python 的 datetime 对象作为参数传给 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 对象),具体可以查看 这里

81

时间戳并没有“格式”这个说法。

处理时间戳的推荐方法是使用准备好的语句(PreparedStatement),在SQL中只放一个占位符,然后通过你所用编程语言的API传入一个“真实”的对象。因为我不太了解Python,所以不知道它是否支持准备好的语句,以及具体的语法是什么。

如果你想在生成的SQL中直接放入一个时间戳的字面值(literal),那么在指定这个值的时候需要遵循一些格式规则(字面值是有格式的)。

伊万的方法是可行的,虽然我不太确定这是否依赖于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'));

撰写回答