Использование многопараметрической подстановки DB-API sqlite3 в операторах SELECT - PullRequest
0 голосов
/ 08 марта 2019

Учитывая:

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 Ответ

1 голос
/ 08 марта 2019

Может быть, вам поможет этот образец.

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-инъекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...