2

我有一个查询 sqlite 数据库的烧瓶应用程序:

@app.route('/<subject_id>')
def subject_id_lookup(subject_id):
    entries = query_db('select visitdt, cvnotes from exam where id = ?',
                        [subject_id], one=True)
    return render_template('show_results.html', entries = entries)

我使用的烧瓶功能与文档基本相同,包括query_db()

def query_db(query, args=(), one = False):
    """Queries the database and returns a list of dictionaries"""
    cur = g.db.execute(query, args)
    rv = [dict((cur.description[idx][0], value)
        for idx, value in enumerate(row)) for row in cur.fetchall()]
    return (rv[0] if rv else None) if one else rv

最后是我的 show_results.html 文件:

{% extends "layout.html" %}
{% block body %}
    <ul class=entries>
        {% for entry in entries %}
        <li><h2>{{ entry }}</h2>
        <br>
        {% else %}
        <li><em>No entry here</em>
        {% endfor %}
    </ul>
    {% endblock %}

查询运行良好,但除了变量名visitdt& 之外什么都没有返回cvnotes。当我将上面的行更改为 时<li><h2>{{ entry.cvnotes }}</h2>,它什么也不返回。如何修改我的查询以显示我的subject_id_lookup()函数的结果?

4

1 回答 1

3

问题是query_db根据您指定one=True或返回不同的东西one=False

>>> query_db(your_query, [some_id], one=True)
{visittd: "a value", cvnotes: "some notes"}

>>> query_db(your_query, [some_id], one=False)
[{visittd: "a value", cvnotes: "some notes"}] # Note the wrapping list

当您枚举字典时,结果是字典中的键 - 当您枚举列表时,结果是列表中的条目。

>>> for thing in query_db(your_query, [some_id], one=True):
...    print thing
visitdt
cvnotes

>>> for thing in query_db(your_query, [some_id], one=False):
...    print thing
{visittd: "a value", cvnotes: "some notes"}

如果您想使用相同的模板,并且您知道只有一个返回一个值id(或者如果您可以处理多个值),只需one=True删除subject_id_lookup. entries然后将是包含键的一个字典的列表,visitdt并且cvnotes- 当您在模板中对其进行迭代时,每个条目将是一个结果字典(而不是单个结果字典中的一个键)并且{{ entry.cvnotes }}将起作用。

于 2012-04-04T03:50:09.140 回答