Python 如何在同一模板中处理多个sqlite3查询?
我的烧瓶申请有问题。我试图在同一页面上显示多个HTML表,其中包含来自同一数据库中3个不同表的数据。 起初,我尝试了以下代码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
@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中工作得很好。不管怎么说,我完全不知道这个空间被考虑进去了。现在一切都按预期执行。很抱歉造成混乱,谢谢!