使用变量提供的表名进行SQL SELECT

3
每次我尝试以下代码,都会出现“near”?“:语法错误”的错误。我尝试了多种方法,包括将其放入变量中进行准备。 在Python中,这是否可能?还是我想得太歪了?
import sqlite3
sqlite_file = 'DATABASE.db'
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
word = ()
question = int(input("What would you like to see?"))
if question == 1:
    word = ("Batchnumbers")
if question == 2:
    word = ("Worker IDs")
c.execute('SELECT * FROM ?', (word))
    data = c.fetchall()
    for x in range(len(data)):
        print(data[x])

1
你使用的是哪个数据库包?因为你不能像其他参数一样直接将表名插入查询中。请注意。 - eagle
我正在使用sqlite3。 - DevOps
1
据我所知,在sqlite3中没有安全执行以表名作为参数的SQL查询的选项,使用字符串插值也是不安全的,请在此处检查,因为他们提供了示例--> https://dev59.com/x3A75IYBdhLWcg3wg5fs - eagle
2个回答

4

查询参数只能用于提供列的,而不能用于表名或列名。如果您需要提供表名,您将需要使用动态SQL,例如:

c.execute('SELECT * FROM "{}"'.format(word))

请注意,这种方法容易受到SQL注入问题的攻击,因此您真的应该考虑减轻这些影响,例如确保word不包含会导致错误(或更糟)的双引号字符。

谢谢,运行得很好!完全忘记了这个!(当我在其他查询中使用它时...该死) - DevOps

2

确实使用这行代码:word =

c.execute('SELECT * FROM "{}"'.format(word))

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