针对行内容的Sqlite查询公式

时间:2011-11-02 23:51:14

标签: python sqlite flask

我正在尝试制定正确的查询来选择每个都有类别的记录:

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 个答案:

答案 0 :(得分:1)

您的代码存在许多问题,但最基本的问题是您的最终SQL语句不会在class_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语句的一部分。

答案 1 :(得分:0)

它看起来像一个引用问题。类别值需要围绕它的双引号,否则它将被解释为字段名称。

试试这个:

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