0

我在sqlite(python sqlite3)中有一个非常简单的查询有一个奇怪的行为

这是一个有效的查询

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,硬编码,命名)...与 qmark 样式相同的行为( ?,? 带元组)

谢谢你的建议 !

4

1 回答 1

2

您不能使用 DB API 来完成表名。我不确定这是什么原因,但我过去也遇到过同样的问题。它不适用于 SQLite 或 MySQL 以及其他可能。

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

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})
于 2013-01-18T15:09:35.020 回答