在mySQL vs postgreSQL中的执行语句(python)中使用%s命令?

时间:2014-07-24 23:52:34

标签: python mysql sql postgresql

我最近在python中使用postgreSQL数据库编写代码,它看起来如下:

def insert(table, ID, date, timestamp):
    cur.execute("""INSERT INTO %s (ID, date, timest)
                   VALUES (%s, %s, %s);""", 
                   (AsIs(table), ID, AsIs(date), AsIs(timestamp))) 

这似乎适用于postgreSQL,但是当我在mySQL服务器上尝试相同的事情时,它不起作用。有没有人知道为什么?我认为这可能与%s字符有关,因为如果我在表格,ID,日期和时间戳的值中进行硬编码,它就会起作用。

此外,它给我以下错误:

_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''master'' at line 2")

'master'是我用作变量的表的名称,我还注意到master周围有两个单引号(如:''master''),其中只有一个。那么这也可能是一个问题?

无论如何,谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

这在PostgreSQL中也不行。表名不应该是参数化的。

cur.execute("""INSERT INTO table_name_here (ID, date, timest) ...

对于字符串连接:Postgres使用SQL标准双引号(两个单引号!):"master",它在默认MySQL中不起作用。必须是`master` - 或只是master才能同时使用。

或者激活MySQL中某些SQL兼容性的设置:

SET sql_mode = 'ANSI';

答案 1 :(得分:0)

您可以使用格式化功能:

sql = "INSERT INTO {0} (ID, date, timest) VALUES (%s, %s, %s);".format(table_name)
cursor.execute(sql, (ID, date, time_stamp))

答案 2 :(得分:-2)

实际上,我能够找到问题的答案。简单地使用%而不是,符号修复了我的问题。

原始代码:

cur.execute("""INSERT INTO %s (ID, date, timest)
               VALUES (%s, %s, %s);""", 
               (AsIs(table), ID, AsIs(date), AsIs(timestamp))) 

固定代码:

cur.execute("""INSERT INTO %s (ID, date, timest)
               VALUES (%s, %s, %s);""" %
               (AsIs(table), ID, AsIs(date), AsIs(timestamp)))