简单Select查询中的Python sqlite3错误

简单Select查询中的Python sqlite3错误,python,sqlite,Python,Sqlite,我在sqlite(PythonSQLite3)中使用一个非常简单的查询时有一个奇怪的行为 下面是一个有效的查询 cursor = self.con.cursor() cursor.execute("SELECT * FROM vpro1 ORDER BY :orderby DESC LIMIT 1", {"table": "vpro1", "orderby": self.unit_timestamp}) 但这一次给了我一个错误 cursor = self.con.cursor() cursor

我在sqlite(PythonSQLite3)中使用一个非常简单的查询时有一个奇怪的行为

下面是一个有效的查询

cursor = self.con.cursor()
cursor.execute("SELECT * FROM vpro1 ORDER BY :orderby DESC LIMIT 1", {"table": "vpro1", "orderby": self.unit_timestamp})
但这一次给了我一个错误

cursor = self.con.cursor()
cursor.execute("SELECT * FROM :table ORDER BY :orderby DESC LIMIT 1", {"table": "vpro1", "orderby": self.unit_timestamp})
例外是

sqlite3.OperationalError: near ":table": syntax error
因此,当我尝试使用qmark作为表名时,它会抛出一个错误,如果我在查询中对其进行硬编码,它就会起作用:orderby可以使用我使用的任何东西(qmark,hardcoded,named)。。。与qmark样式相同的行为(?,具有元组)


谢谢你的建议

不能使用DB API来完成表名。我不确定这是什么原因,但我在过去也遇到过同样的问题。它在SQLite或MySQL中不起作用,也可能在其他系统中不起作用

有关解决方法,请参阅的对另一个问题的回答

def scrub(table_name):
    return ''.join( chr for chr in table_name if chr.isalnum() )

scrub('); drop tables --')  # returns 'droptables'
然后将其作为格式字符串传入

table = "vpro1"
cursor.execute("SELECT * FROM {0} ORDER BY :orderby DESC LIMIT 1".format(scrub(table)), {"orderby": self.unit_timestamp})

谢谢你的解决方案!我已经搜索了唐纳德·米纳的帖子,但一直没有找到,所以谢谢你(和他的)提示!