【问题标题】:How do you pass through a python variable into sqlite3 query? [duplicate]如何将 python 变量传递给 sqlite3 查询? [复制]
【发布时间】:2025-11-27 16:40:01
【问题描述】:

代码应该根据用户在 python 环境中的输入执行查询(而不是在 sql 查询中)。例如,该变量是在 Python 环境中定义的,并且在 table name = customers 的原始输入中,我希望查询打印表客户的列名。

但是,下面的代码报告语法错误。如果我删除反斜杠和内引号,它将报告no such column: table_name。看来customers 的值没有被传递到查询中,并且查询正在将table_name 作为字符串读取。

请帮忙。谢谢

import sqlite3

    def ask_column(db_name, table_name):
        conn = sqlite3.connect(db_name)
        c = conn.cursor()
        c.execute('SELECT sql FROM sqlite_master WHERE type = \'table\' And name = \'table_name\'') 
        print c.fetchall()
        conn.close()

db_name = raw_input("Please type the database name : ")
table_name = raw_input("Please type the table name: ")
ask_column(db_name, table_name)

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    您可以使用参数替换来做到这一点。使用 Python's sqlite3 module 时,请将参数值替换为问号 (?) 并提供 元组 值。 Python 将自动处理替换并转义值以限制 SQL 注入的风险。

    这是一个例子:首先,创建一个表:

    >>> import sqlite3
    >>> c = conn.cursor()
    >>> c.execute("""CREATE TABLE test (fruit, colour)""")
    <sqlite3.Cursor object at 0x7f41e929f650>
    

    现在插入一些值:注意? 字符如何用作值的占位符:

    >>> c.executemany("""INSERT INTO test VALUES (?, ?)""", [('apple', 'green'), ('banana', 'yellow'), ('cherry', 'red')])
    <sqlite3.Cursor object at 0x7f41e929f650>
    

    这是一个查询(请注意,我们将值作为元组传递,即使只有一个值):

    >>> c.execute("""SELECT fruit, colour FROM test WHERE fruit = ?;""", ('apple',)) 
    <sqlite3.Cursor object at 0x7f41e929f650>
    >>> print(c.fetchall())
    [('apple', 'green')]
    

    【讨论】: