【问题标题】:How to use variable for SQLite table name [duplicate]如何为 SQLite 表名使用变量 [重复]
【发布时间】:2017-01-04 21:46:04
【问题描述】:

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

c.execute('SELECT * FROM ?', (table,))

程序卡在问号处。它说:

“Sqlite3.OperationalError:靠近“?”:语法错误”

我做错了什么?

【问题讨论】:

    标签: python sqlite python-3.x


    【解决方案1】:

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

    query = 'SELECT * FROM {}'.format(table)
    c.execute(query)
    

    需要注意的一点是表名的值的来源。如果那来自不受信任的来源,例如一个用户,那么您需要验证表名以避免潜在的 SQL 注入攻击。一种方法可能是构造一个参数化查询,从数据库目录中查找表名:

    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 是否知道如何验证输入?因为我有建表的功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多