diff --git a/datasette/app.py b/datasette/app.py index ff3de281..b87f150d 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -4,6 +4,7 @@ from sanic.exceptions import NotFound from sanic.views import HTTPMethodView from sanic_jinja2 import SanicJinja2 from jinja2 import FileSystemLoader +import re import sqlite3 from pathlib import Path from concurrent import futures @@ -286,6 +287,7 @@ async def favicon(request): class DatabaseView(BaseView): template = 'database.html' + re_named_parameter = re.compile(':([a-zA-Z0-0_]+)') async def data(self, request, name, hash): if request.args.get('sql'): @@ -316,6 +318,19 @@ class DatabaseView(BaseView): params = request.raw_args sql = params.pop('sql') validate_sql_select(sql) + + # Extract any :named parameters + named_parameters = self.re_named_parameter.findall(sql) + named_parameter_values = { + named_parameter: params.get(named_parameter) or '' + for named_parameter in named_parameters + } + + # Set to blank string if missing from params + for named_parameter in named_parameters: + if named_parameter not in params: + params[named_parameter] = '' + extra_args = {} if params.get('_sql_time_limit_ms'): extra_args['custom_time_limit'] = int(params['_sql_time_limit_ms']) @@ -335,6 +350,7 @@ class DatabaseView(BaseView): }, { 'database_hash': hash, 'custom_sql': True, + 'named_parameter_values': named_parameter_values, } diff --git a/datasette/static/app.css b/datasette/static/app.css index 9f48582a..9a3f153d 100644 --- a/datasette/static/app.css +++ b/datasette/static/app.css @@ -83,14 +83,24 @@ form.sql textarea { font-family: monospace; font-size: 1.3em; } +form.sql label { + font-weight: bold; + display: inline-block; + width: 15%; +} +form.sql input[type=text] { + border: 1px solid #ccc; + width: 60%; + padding: 4px; + font-family: monospace; + display: inline-block; + font-size: 1.1em; +} @media only screen and (max-width: 576px) { form.sql textarea { width: 95%; } } -form.sql p { - margin: 0; -} form.sql input[type=submit] { color: #fff; background-color: #007bff; diff --git a/datasette/templates/database.html b/datasette/templates/database.html index 4b405ea0..884a1c4b 100644 --- a/datasette/templates/database.html +++ b/datasette/templates/database.html @@ -16,7 +16,7 @@ {% endblock %} @@ -33,7 +33,14 @@ {% endif %}
+

Custom SQL query

+ {% if named_parameter_values %} +

Query parameters

+ {% for name, value in named_parameter_values.items() %} +

+ {% endfor %} + {% endif %}