您如何将python变量传递给sqlite3查询?

yam*_*ool 2 python sqlite

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

但是,下面的代码报告语法错误。如果我删除反斜杠和内引号,它会报告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)
Run Code Online (Sandbox Code Playgroud)

sna*_*erb 6

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

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

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

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

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

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

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