Использование подготовленных SQL-операторов с SELECT - PullRequest
3 голосов
/ 09 августа 2011

Я работаю над небольшим любимым проектом, который организует комиксы людей и сохраняет метаданные о них в базе данных SQL.Ради правильности, я использую подготовленные операторы вместо встроенных строковых операторов Python, но я не могу заставить их работать правильно.Вот краткий фрагмент кода, который я сделал для иллюстрации проблем, с которыми я сталкиваюсь:

#!/usr/bin/env python

import sqlite3

connection = sqlite3.connect("MyComicBox.db")

curs = connection.cursor()

curs.execute("CREATE TABLE IF NOT EXISTS comic_collection (id INTEGER PRIMARY KEY, series TEXT, publisher TEXT, issue TEXT, tags TEXT)")

connection.commit()

def addComic(series = "", publisher = "", issue = "", tags = ""):
    curs.execute("INSERT INTO comic_collection (series, publisher, issue, tags) VALUES(?, ?, ?, ?)", (series, publisher, issue, tags))
    connection.commit()

def search(attribute, val):
    """
    Do an SQL query for all comics where attribute LIKE val and return a list of them.
    """

#   cmd = "SELECT * from comic_collection WHERE %s LIKE '%s'" % (attribute, val)
#   curs.execute(cmd)

    cmd = "SELECT * from comic_collection WHERE ? LIKE ?"
    curs.execute(cmd, (attribute, val))

    results = []

    for comic in curs:
        results.append(comic)

    return results

addComic(series = "Invincible Iron Man", issue = "500", publisher = "Marvel Comics", tags = "Iron Man; Spider-Man; Mandarin")


searchResults = search("issue", "500")

for item in searchResults:
    print item

Моя проблема в функции поиска.Запрос ничего не возвращает, если я не заменю две строки, где я выполняю cmd, используя?оператор с двумя (закомментированными) строками, где я выполняю cmd, используя встроенные строковые операторы Python.Кто-нибудь может помочь мне понять, что я делаю неправильно?

Ответы [ 3 ]

7 голосов
/ 09 августа 2011

Нельзя использовать заполнители для имен столбцов - они только для значений.Так что это будет работать:

cmd = "SELECT * from comic_collection WHERE %s LIKE ?" % attribute
curs.execute(cmd, (val,))
2 голосов
/ 09 августа 2011

Вы используете attribute неправильно. Представьте, что ? уже включает в себя его выдающиеся '' с.

Один из способов сделать это так:

cmd = "SELECT * from comic_collection WHERE %s LIKE ?" % attribute
curs.execute(cmd, val)

но вы обязательно должны убедиться, что атрибут не является источником из ненадежного источника здесь или что он имеет только допустимые значения, возможно,

assert attribute in ('series', 'publisher', 'issue', 'tags')
0 голосов
/ 09 августа 2011

Из того, что я помню из подготовленных утверждений в sqlite C api, вам, возможно, придется написать это так:

cmd = "SELECT * from comic_collection ГДЕ? 1 НРАВИТСЯ? 2"

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