Sqlite формулировка запроса с таргетингом на содержимое строки - PullRequest
0 голосов
/ 03 ноября 2011

Я пытаюсь сформулировать правильный запрос для выбора записей, каждая из которых имеет категорию:

drop table if exists entries;
create table entries (
id integer primary key autoincrement,
title string not null,
text string not null,
pub_date integer,
category string not null);

Я прочитал документацию sqlite и до сих пор не могу понять, почему я получаю: «нет такой колонки: Музыка», где музыка - это фиктивная категория.

Here's the function:

@app.route('/<category_name>')
def show_entries(category_name):
cur = g.db.execute('select id,title, text,pub_date,category from entries where category   
 =' +category_name)       
entries = [dict(id=row[0], title=row[1], text=row[2],
           pub_date=row[3],category=row[4]) for row in cur.fetchall()]
return render_template('show_entries.html', entries=entries)

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Существует ряд проблем с вашим кодом, но самая основная из них заключается в том, что ваш последний оператор SQL не ставит кавычки вокруг значения category_name, как требуется для строк в SQL (и большинстве других языков).

То, что вы отправляете в SQLite:

select id,title, text,pub_date,category from entries where category = music

и должно быть:

select id,title, text,pub_date,category from entries where category = 'music'

Однако вы никогда не должны строить операторы SQL путем объединения строк вместе, так как это подвергает васвероятность того, что подлый человек (или бот) поместит что-то в одну из этих строк, которая уничтожит вашу базу данных.

Вместо этого вам следует сделать следующее:

 cur = g.db.execute(
         'select id,title, text,pub_date,category from entries where category = ?',
         [category_name])

, которая называется параметризованный запрос .В этом случае база данных обеспечит правильную обработку category_name как части строковых данных, а не (потенциально) части оператора SQL.

0 голосов
/ 03 ноября 2011

Похоже, проблема цитирования.Значение категории требует двойных кавычек вокруг него, иначе оно будет интерпретировано как имя поля.

Попробуйте это:

cur = g.db.execute('select id,title, text,pub_date,category from entries where category = (?)', (category_name,)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...