我正在尝试制定正确的查询来选择每个都有类别的记录:
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)
感谢您帮助我!
答案 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,))