2016-10-04 88 views
1

我使用psycopg2作为postgresql。这里是我的代码片段:postgresql插入python的时间戳错误

a = "INSERT INTO tweets (Time) VALUES (%s);" % (datetime.now(),) 

cursor.execute(a) 

这不会工作,并给我一个错误:

ProgrammingError: syntax error at or near "20" 
LINE 1: INSERT INTO tweets (Time) VALUES (2016-10-03 20:14:49.065092... 

但是,如果我以这种方式运行:

cursor.execute("INSERT INTO tweets (Time) VALUES (%s);", (datetime.now(),)) 

它的工作原理。我想知道这两个表达式之间有什么区别,第一个表达有什么问题。我可以使用第一个结构来做这个功能吗?

+0

第一次使用Python字符串替换。第二个使用Psycopg参数传递,是唯一推荐的。 –

回答

3

如果您检查第一个查询,它说明INSERT INTO tweets (Time) VALUES (2016-10-03 20:14:49.065092...,这意味着,它会尝试使用未加引号的值作为时间,这是行不通的。

如果你真的想使用你的第一种方法,你要引用的值:

a = "INSERT INTO tweets (Time) VALUES ('%s');" % (datetime.now(),) 
cursor.execute(a) 

我建议你使用第二种方法,即客户端库处理所有的报价,通常可以防止很多可能的问题,如SQL注入。

+0

甚至不建议使用第一种方法 – piro