diff --git a/datasette/templates/database.html b/datasette/templates/database.html index 1d40455292..5bb8a8be7b 100644 --- a/datasette/templates/database.html +++ b/datasette/templates/database.html @@ -16,7 +16,7 @@

+

Custom SQL query

diff --git a/datasette/templates/query.html b/datasette/templates/query.html index c7d6c5a857..020153f62a 100644 --- a/datasette/templates/query.html +++ b/datasette/templates/query.html @@ -23,7 +23,7 @@

{{ database }}

- +

Custom SQL query{% if rows %} returning {% if truncated %}more than {% endif %}{{ "{:,}".format(rows|length) }} row{% if rows|length == 1 %}{% else %}s{% endif %}{% endif %}

{% if editable %}

diff --git a/datasette/views/base.py b/datasette/views/base.py index 997350ddbc..3562bbc1b1 100644 --- a/datasette/views/base.py +++ b/datasette/views/base.py @@ -107,6 +107,8 @@ def resolve_db_name(self, db_name, **kwargs): hash = None else: name = db_name + if name == "memory": + return "memory", "", None # Verify the hash try: info = databases[name] @@ -143,14 +145,25 @@ async def execute( def sql_operation_in_thread(): conn = getattr(connections, db_name, None) if not conn: - info = self.ds.inspect()[db_name] + if db_name == "memory": + filename = ":memory:" + else: + info = self.ds.inspect()[db_name] + filename = info["file"] conn = sqlite3.connect( - "file:{}?immutable=1".format(info["file"]), + "file:{}?immutable=1".format(filename), uri=True, check_same_thread=False, ) self.ds.prepare_connection(conn) setattr(connections, db_name, conn) + if db_name == "memory": + # Loop through and attach all the other DBs + for dbname, dbinfo in self.ds.inspect().items(): + sql2 = 'ATTACH DATABASE "file:{}?immutable=1" AS [{}];'.format( + dbinfo["file"], dbname + ) + conn.execute(sql2) time_limit_ms = self.ds.sql_time_limit_ms if custom_time_limit and custom_time_limit < self.ds.sql_time_limit_ms: diff --git a/datasette/views/database.py b/datasette/views/database.py index 3ccd7ef02c..ccbb952f98 100644 --- a/datasette/views/database.py +++ b/datasette/views/database.py @@ -15,7 +15,17 @@ async def data(self, request, name, hash): validate_sql_select(sql) return await self.custom_sql(request, name, hash, sql) - info = self.ds.inspect()[name] + if name == "memory": + info = {"tables": { + "sqlite_master": { + "name": "sqlite_master", + "hidden": False, + "columns": [], + "count": 0, + } + }, "views": []} + else: + info = self.ds.inspect()[name] metadata = self.ds.metadata.get("databases", {}).get(name, {}) self.ds.update_with_inherited_metadata(metadata) tables = list(info["tables"].values())