psycopg 插入时间戳而不格式化

psycopg insert timestamp without formatting it

我有一个时间戳,我正在尝试使用 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 在 space 上挂断了。我试过使用 PG to_timestamp(),但 PG 在相同的地方挂断了。我最终会得到其中的一些,并且我试图避免将其分解成几个我必须重新组合在一起的字符串。有人有什么想法吗?如果需要,我可以操纵原始时间戳字符串,但我无法弄清楚该字符串应该是什么样子才能让 PG 满意。

提前致谢

你不应该那样格式化你的字符串。正如 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 会为您处理转义。