Re-display user's query with an error message if an error occurs (#1346)

* Ignore _shape when returning errors
This commit is contained in:
Simon Willison 2021-06-01 23:46:20 -04:00 committed by GitHub
commit 9552414e1f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 13 deletions

View file

@ -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,
)