2017-04-06 83 views
0

我有一个时间戳,我试图插入到postgres使用psycopg,但我有麻烦让事情解决,我认为这是因为我想使用python的字符串格式将日期放到正确的位置。我有类似的东西psycopg插入时间戳没有格式化

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

Postgres正在绊倒“T”,抛出语法错误。

我已经试过字符串转换为DateTime对象,但随后的格式只是把它放回,看起来像这样

2016-03-01 12:40:45.236697 

和Postgres的空间挂断的字符串。我试过使用PG to_timestamp(),但是PG在相同的地方挂起。我最终会得到一些这样的结果,并且我试图避免将它分解成几个字符串,我必须将它们连接在一起。有没有人有任何想法?如果需要,我可以操作原始时间戳字符串,但我无法弄清楚该字符串应该是什么样子让PG感到开心。

在此先感谢

+0

https://xkcd.com/327/ –

回答

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为您处理逃跑。

+0

谢谢,伯尼。这是一个内部API,我们控制所有内容,所以我甚至没有考虑过SQL注入,但我应该知道有更好的方法。我会深入研究psycopg2文档。 – gignosko

+0

@gignosko:你很受欢迎。祝你好运psycopg2文档!快乐的编码给你:-) – bernie