如何通过Python将当前时间戳插入Postgres
我需要在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'));