Python 如何使用变量作为SQLite表名

Python 如何使用变量作为SQLite表名,python,sqlite,python-3.x,Python,Sqlite,Python 3.x,我有一个程序,用户可以在其中选择要在SQLite中修改的表。我将选择存储在一个名为table的变量中,然后尝试从该表中选择所有内容 c.execute('SELECT * FROM ?', (table,)) 程序在问号处卡住了。它说: “Sqlite3.0错误:靠近“”:语法错误” 我做错了什么?不能用参数替换表名。您需要自己将表名添加到查询字符串中。大概是这样的: query = 'SELECT * FROM {}'.format(table) c.execute(query) 需要注意

我有一个程序,用户可以在其中选择要在SQLite中修改的表。我将选择存储在一个名为
table
的变量中,然后尝试从该表中选择所有内容

c.execute('SELECT * FROM ?', (table,))
程序在问号处卡住了。它说:

“Sqlite3.0错误:靠近“”:语法错误”

我做错了什么?

不能用参数替换表名。您需要自己将表名添加到查询字符串中。大概是这样的:

query = 'SELECT * FROM {}'.format(table)
c.execute(query)
需要注意的一件事是表名值的来源。如果来自不受信任的来源,例如用户,则需要验证表名以避免潜在的SQL注入攻击。一种方法可能是构造一个参数化查询,从DB目录中查找表名:

import sqlite3

def exists_table(db, name):
    query = "SELECT 1 FROM sqlite_master WHERE type='table' and name = ?"
    return db.execute(query, (name,)).fetchone() is not None

成功了。谢谢,我想我做到了。程序首先获取表的名称列表并显示它们。然后用户必须输入其中一个名称。如果输入与列表中的名称不匹配,程序将返回到表名列表,并再次请求输入。@Josh:这应该是安全的。我还向我的答案中添加了一种方法,可以根据SQLite的主表验证用户输入的表名。嘿,sb知道如果输入来自用户而该表不存在,我如何验证输入吗?因为我有一个创建表的函数