在SELECT语句中使用sqlite3 DB-API多参数替换

时间:2019-03-08 16:14:39

标签: python sqlite

给出:

letters = list("abc")

我想在characters列的letters中获取所有包含c中任何字母的行。我可以这样做,但只能使用python的字符串操作,考虑到它的漏洞,这是不合适的。

理想情况下(我的示例已简化),这将使用GLOB子句。

例如

>>> cur.execute(**the statement here**)
>>> print(cur.fetchall())
>>> [('a',), ('b',), ('c',)]

数据库的创建:

import sqlite3
import string

def char_generator():
    for c in string.ascii_lowercase:
        yield (c,)

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table characters(c)")

cur.executemany("insert into characters(c) values (?)", char_generator())

1 个答案:

答案 0 :(得分:1)

也许此示例可以为您提供帮助。

import sqlite3
import string

def char_generator():
    for c in string.ascii_lowercase:
        yield (c,)


con = sqlite3.connect(":memory:")

def initdb():
    cur = con.cursor()
    cur.execute("create table characters(c)")

    cur.executemany("insert into characters(c) values (?)", char_generator())

def search(value):
    values = [c for c in value]
    cur = con.cursor()
    cur.execute('SELECT * FROM characters WHERE c IN ({0})'.format(','.join(['?' for c in values])), values)
    return cur.fetchall()


if __name__ == '__main__':
    initdb()
    print(search("abcde"))

此代码使用参数。因此,您不必担心SQL注入。