psycopg插入时间戳而不格式化

时间:2017-04-06 21:15:58

标签: python postgresql psycopg2

我有一个时间戳,我正在尝试使用psycopg插入postgres,但我无法解决问题,我认为这是因为我正在尝试使用python的字符串格式化将日期放入正确的位置。我有类似的东西

values = {"timestamp": u'2016-03-01T12:40:45.236697', ...}
"INSERT...VALUES(...{timestamp}...)".format(**values)

Postgres正在绊倒“T”,引发语法错误。

我已经尝试将字符串转换为日期时间对象,但格式化只是将其放回一个看起来像这样的字符串

2016-03-01 12:40:45.236697

和postgres挂在空间上。我试过使用PGs to_timestamp(),但是PG挂在同一个地方。我最终会得到其中的一些,我试图避免将其分解为几个字符串,我必须重新连接起来。有没有人有任何想法?如果需要的话,我可以操作原始的时间戳字符串,但是我无法弄清楚该字符串应该是什么让PG开心。

提前致谢

1 个答案:

答案 0 :(得分:3)

你不应该像那样格式化你的字符串。正如Ilja在评论中提到的那样,你很容易受到SQL注入攻击。您应该将字典作为第二个参数传递给.execute(),例如:

import datetime as dt
t = u'2016-03-01T12:40:45.236697'
cur.execute(
    """INSERT INTO your_table (timestamp, ...)
        VALUES (%(timestamp)s, ...);""",
     {'timestamp': dt.datetime.strptime(t,'%Y-%m-%dT%H:%M:%S.%f'), ...})

这确保插入正确的数据类型,psycopg2为您处理转义。