代码应该基于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)
答案 0 :(得分:4)
您可以使用参数替换执行此操作。使用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')]