Python 如何在同一模板中处理多个sqlite3查询?

Python 如何在同一模板中处理多个sqlite3查询?,python,sqlite,flask,Python,Sqlite,Flask,我的烧瓶申请有问题。我试图在同一页面上显示多个HTML表,其中包含来自同一数据库中3个不同表的数据。 起初,我尝试了以下代码 @bp.route('/') @login_required def summary(): db = get_db() expense_entries = db.execute( 'SELECT id, expense_date, expense_item, expense_value, expense_item_category, expense_sour

我的烧瓶申请有问题。我试图在同一页面上显示多个HTML表,其中包含来自同一数据库中3个不同表的数据。 起初,我尝试了以下代码

@bp.route('/')
@login_required
def summary():
 db = get_db()

 expense_entries = db.execute(
    'SELECT id, expense_date, expense_item, expense_value, expense_item_category, expense_source'
    ' FROM budget_expense'
    ' ORDER BY expense_date ASC'
 ).fetchall()

 revenue_entries = db.execute(
    'SELECT id, revenue_date, revenue_value, revenue_source'
    'FROM budget_revenue'
    'ORDER BY revenue_date ASC'
 ).fetchall()

 savings_entries = db.execute(
    'SELECT id, savings_date,savings_value, savings_source, savings_reason, savings_action'
    'FROM budget_savings'
    'ORDER BY savings_date ASC'
 ).fetchall()

 return render_template('budget/summary.html', expense_entries=expense_entries, revenue_entries=revenue_entries, savings_entries=savings_entries)
然后我有一个模板,可以循环并设置HTML表中的值。附带说明,当我只添加了一个
db.execute().fetchall()
时,它就可以正常工作了

我得到的错误是
sqlite3.OperationalError:near“BY”:在
revenue\u条目db.execute()
-->中出现语法错误,这种情况每次都会发生,直到我删除所有其他
db.execute()
命令,直到只剩下一个为止。我已经在SQLite的DB浏览器中测试了查询,它们执行得很好,没有语法错误

经过一些研究,我在这个问题上发现了类似的东西:

并对类对象进行了相同的尝试,如下所示:

@bp.route('/')
@login_required
def summary():
    class BudgetDbConnector:
        def __init__(self):
            self.db = get_db()

        @property
        def expense_entries(self):
            return self.db.execute(
                'SELECT id, expense_date, expense_item, expense_value, expense_item_category, expense_source'
                ' FROM budget_expense'
                ' ORDER BY expense_date ASC')

        @property
        def revenue_entries(self):
            return self.db.execute(
                'SELECT id, revenue_date, revenue_value, revenue_source'
                'FROM budget_revenue'
                'ORDER BY revenue_date ASC')

        @property
        def savings_entries(self):
            return self.db.execute(
                'SELECT id, savings_date,savings_value, savings_source, savings_reason, savings_action'
                'FROM budget_savings'
                'ORDER BY savings_date ASC')

    return render_template('budget/summary.html', _object=BudgetDbConnector())
与问题链接中的模板循环完全相同。当仅同时调用一个对象时,If的工作方式同样良好。如果在模板中添加其他两个查询,我将收到上面显示的确切错误

这是当我只从类对象执行1个查询时的HTML结构。在不使用类对象的情况下,块
将被替换为参数
费用项、收入项、储蓄项

{% for obj in _object.expense_entries %}
          <tbody class="post">
            <tr>
                <th class="small mb-1">{{ obj['id'] }}</th>
                <th class="small mb-1">{{ obj['expense_date'] }}</th>
                <th class="small mb-1">{{ obj['expense_item'] }}</th>
                <th class="small mb-1">{{ obj['expense_value'] }}</th>
                <th class="small mb-1">{{ obj['expense_item_category'] }}</th>
                <th class="small mb-1">{{ obj['expense_source'] }}</th>
            </tr>
          </tbody>
 {% endfor %}
{u object.expense\u entries%}
{{obj['id']}
{{obj['expense_date']}
{{obj['expense_item']}
{{obj['expense_value']}
{{obj['expense_item_category']}
{{obj['expense_source']}
{%endfor%}
这是我尝试执行所有3条语句时的HTML结构

{% for obj in _object.expense_entries %}
    <tbody class="post">
     <tr>
        <th class="small mb-1">{{ obj['id'] }}</th>
        <th class="small mb-1">{{ obj['expense_date'] }}</th>
        <th class="small mb-1">{{ obj['expense_item'] }}</th>
        <th class="small mb-1">{{ obj['expense_value'] }}</th>
        <th class="small mb-1">{{ obj['expense_item_category'] }}</th>
        <th class="small mb-1">{{ obj['expense_source'] }}</th>
    </tr>
   </tbody>
{% endfor %}
{% for obj in _object.revenue_entries %}
<tbody class="post">
  <tr>
      <th class="small mb-1">{{ obj['id'] }}</th>
      <th class="small mb-1">{{ obj['revenue_date'] }}</th>
      <th class="small mb-1">{{ obj['revenue_value'] }}</th>
      <th class="small mb-1">{{ obj['revenue_source'] }}</th>
  </tr>
</tbody>
{% endfor %}

{% for obj in _object.savings_entries %}
<tbody class="post">
  <tr>
      <th class="small mb-1">{{ obj['id'] }}</th>
      <th class="small mb-1">{{ obj['savings_date'] }}</th>
      <th class="small mb-1">{{ obj['savings_value'] }}</th>
      <th class="small mb-1">{{ obj['savings_source'] }}</th>
      <th class="small mb-1">{{ obj['savings_reasons'] }}</th>
      <th class="small mb-1">{{ obj['savings_action'] }}</th>
  </tr>
</tbody>
{% endfor %}
{u object.expense\u entries%}
{{obj['id']}
{{obj['expense_date']}
{{obj['expense_item']}
{{obj['expense_value']}
{{obj['expense_item_category']}
{{obj['expense_source']}
{%endfor%}
{u object.revenue\u entries%}
{{obj['id']}
{{obj['revenue_date']}
{{obj['revenue_value']}
{{obj['revenue_source']}
{%endfor%}
{u object.savings\u entries%}
{{obj['id']}
{{obj['savings_date']}
{{obj['savings_value']}
{{obj['savings_source']}
{{obj['savings_reasons']}
{{obj['savings_action']}
{%endfor%}

我的代码中是否有错误,或者sqlite3是否不适合多个并发查询?

当您实际遇到语法错误时,正如它所说的,您是在责怪SQLite。这两个查询之间有一个非常重要的区别:

   'SELECT id, expense_date, expense_item, expense_value, expense_item_category, expense_source'
    ' FROM budget_expense'
    ' ORDER BY expense_date ASC'

    'SELECT id, revenue_date, revenue_value, revenue_source'
    'FROM budget_revenue'
    'ORDER BY revenue_date ASC'

不同之处在于第二行开头的空格。您传递的基本上是“…,revenue\u sourceFROM budget\u revenueORDER BY…”,因此“BY”是一个语法错误。

我没有责怪SQLite,我只是假设主要是这样,因为命令在DB viewer中工作得很好。不管怎么说,我完全不知道这个空间被考虑进去了。现在一切都按预期执行。很抱歉造成混乱,谢谢!