mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Re-display user's query with an error message if an error occurs (#1346)
* Ignore _shape when returning errors
This commit is contained in:
parent
0f1e47287c
commit
9552414e1f
5 changed files with 44 additions and 13 deletions
|
|
@ -14,6 +14,7 @@ from datasette.utils import (
|
|||
path_with_added_args,
|
||||
path_with_format,
|
||||
path_with_removed_args,
|
||||
sqlite3,
|
||||
InvalidSql,
|
||||
)
|
||||
from datasette.utils.asgi import AsgiFileDownload, Response, Forbidden
|
||||
|
|
@ -239,6 +240,8 @@ class QueryView(DataView):
|
|||
|
||||
templates = [f"query-{to_css_class(database)}.html", "query.html"]
|
||||
|
||||
query_error = None
|
||||
|
||||
# Execute query - as write or as read
|
||||
if write:
|
||||
if request.method == "POST":
|
||||
|
|
@ -320,10 +323,15 @@ class QueryView(DataView):
|
|||
params_for_query = MagicParameters(params, request, self.ds)
|
||||
else:
|
||||
params_for_query = params
|
||||
results = await self.ds.execute(
|
||||
database, sql, params_for_query, truncate=True, **extra_args
|
||||
)
|
||||
columns = [r[0] for r in results.description]
|
||||
try:
|
||||
results = await self.ds.execute(
|
||||
database, sql, params_for_query, truncate=True, **extra_args
|
||||
)
|
||||
columns = [r[0] for r in results.description]
|
||||
except sqlite3.DatabaseError as e:
|
||||
query_error = e
|
||||
results = None
|
||||
columns = []
|
||||
|
||||
if canned_query:
|
||||
templates.insert(
|
||||
|
|
@ -337,7 +345,7 @@ class QueryView(DataView):
|
|||
|
||||
async def extra_template():
|
||||
display_rows = []
|
||||
for row in results.rows:
|
||||
for row in results.rows if results else []:
|
||||
display_row = []
|
||||
for column, value in zip(results.columns, row):
|
||||
display_value = value
|
||||
|
|
@ -423,17 +431,20 @@ class QueryView(DataView):
|
|||
|
||||
return (
|
||||
{
|
||||
"ok": not query_error,
|
||||
"database": database,
|
||||
"query_name": canned_query,
|
||||
"rows": results.rows,
|
||||
"truncated": results.truncated,
|
||||
"rows": results.rows if results else [],
|
||||
"truncated": results.truncated if results else False,
|
||||
"columns": columns,
|
||||
"query": {"sql": sql, "params": params},
|
||||
"error": str(query_error) if query_error else None,
|
||||
"private": private,
|
||||
"allow_execute_sql": allow_execute_sql,
|
||||
},
|
||||
extra_template,
|
||||
templates,
|
||||
400 if query_error else 200,
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue