PostgreSQL插入时间戳错误(使用Python)

4

我使用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(),))

它可以工作。我想知道这两个表达式之间的区别,以及第一个表达式有什么问题。我能使用第一种结构来执行此函数吗?


1
第一个使用Python字符串替换。第二个使用Psycopg参数传递,是唯一建议的方法。 - Clodoaldo Neto
1个回答

7

如果你检查第一个查询,可以看到它是这样的: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注入。

不要建议使用第一种方法。 - piro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接