我将psycopg2用于postgresql。这是我的片段:
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 :(得分:4)
如果您检查第一个查询,它会指出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注入等许多可能的问题。