如何为SQLite表名使用变量

Jos*_*osh 3 python sqlite python-3.x

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

c.execute('SELECT * FROM ?', (table,))
Run Code Online (Sandbox Code Playgroud)

程序卡在问号上.它说:

"Sqlite3.OperationalError:near"?":语法错误"

我究竟做错了什么?

mha*_*wke 7

您不能对表名使用参数替换.您需要自己将表名添加到查询字符串中.像这样的东西:

query = 'SELECT * FROM {}'.format(table)
c.execute(query)
Run Code Online (Sandbox Code Playgroud)

需要注意的一件事是表名的值的来源.如果它来自不受信任的来源,例如用户,那么您需要验证表名以避免潜在的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
Run Code Online (Sandbox Code Playgroud)