首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单选择查询中的Python sqlite3 OperationalError

简单选择查询中的Python sqlite3 OperationalError
EN

Stack Overflow用户
提问于 2013-01-18 22:59:20
回答 1查看 1.4K关注 0票数 0

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

下面是一个有效的查询

代码语言:javascript
复制
cursor = self.con.cursor()
cursor.execute("SELECT * FROM vpro1 ORDER BY :orderby DESC LIMIT 1", {"table": "vpro1", "orderby": self.unit_timestamp})

但这一次抛出了一个错误

代码语言:javascript
复制
cursor = self.con.cursor()
cursor.execute("SELECT * FROM :table ORDER BY :orderby DESC LIMIT 1", {"table": "vpro1", "orderby": self.unit_timestamp})

例外情况是

代码语言:javascript
复制
sqlite3.OperationalError: near ":table": syntax error

因此,当我尝试为表名使用qmark时,它会抛出一个错误,如果我在查询中对其进行硬编码,它就会起作用,我使用的任何东西(qmark、hardcode、name )都可以使用:orderby。与qmark样式相同的行为(?,?使用元组)

谢谢你的建议!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-18 23:09:35

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

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

代码语言:javascript
复制
def scrub(table_name):
    return ''.join( chr for chr in table_name if chr.isalnum() )

scrub('); drop tables --')  # returns 'droptables'

然后将其作为格式字符串传递。

代码语言:javascript
复制
table = "vpro1"
cursor.execute("SELECT * FROM {0} ORDER BY :orderby DESC LIMIT 1".format(scrub(table)), {"orderby": self.unit_timestamp})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14401586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档