From 0c22fa8f09e9fce7434d5fc83bcfb73c25795205 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sat, 16 Jun 2018 10:33:17 -0700 Subject: [PATCH] Cleaned up view_definition/table_definition code in table view Also moved those out of standard JSON into just the HTML template context --- datasette/app.py | 15 +++++++++++++++ datasette/views/table.py | 39 ++++++--------------------------------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index 6cfc3666..871a4bf1 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -171,6 +171,21 @@ class Datasette: if query: return {"name": query_name, "sql": query} + async def get_table_definition(self, database_name, table, type_="table"): + table_definition_rows = list( + await self.execute( + database_name, + 'select sql from sqlite_master where name = :n and type=:t', + {"n": table, "t": type_}, + ) + ) + if not table_definition_rows: + return None + return table_definition_rows[0][0] + + def get_view_definition(self, database_name, view): + return self.get_table_definition(database_name, view, 'view') + def asset_urls(self, key): # Flatten list-of-lists from plugins: seen_urls = set() diff --git a/datasette/views/table.py b/datasette/views/table.py index 272902fb..359bc81b 100644 --- a/datasette/views/table.py +++ b/datasette/views/table.py @@ -243,39 +243,12 @@ class TableView(RowTableShared): canned_query=table, ) - is_view = bool( - list( - await self.ds.execute( - name, - "SELECT count(*) from sqlite_master WHERE type = 'view' and name=:n", - {"n": table}, - ) - )[0][0] - ) - view_definition = None - table_definition = None - if is_view: - view_definition = list( - await self.ds.execute( - name, - 'select sql from sqlite_master where name = :n and type="view"', - {"n": table}, - ) - )[0][0] - else: - table_definition_rows = list( - await self.ds.execute( - name, - 'select sql from sqlite_master where name = :n and type="table"', - {"n": table}, - ) - ) - if not table_definition_rows: - raise NotFound("Table not found: {}".format(table)) - - table_definition = table_definition_rows[0][0] + is_view = bool(await self.ds.get_view_definition(name, table)) info = self.ds.inspect() table_info = info[name]["tables"].get(table) or {} + if not is_view and not table_info: + raise NotFound("Table not found: {}".format(table)) + pks = table_info.get("primary_keys") or [] use_rowid = not pks and not is_view if use_rowid: @@ -749,14 +722,14 @@ class TableView(RowTableShared): "_rows_and_columns.html", ], "metadata": metadata, + "view_definition": await self.ds.get_view_definition(name, table), + "table_definition": await self.ds.get_table_definition(name, table), } return { "database": name, "table": table, "is_view": is_view, - "view_definition": view_definition, - "table_definition": table_definition, "human_description_en": human_description_en, "rows": rows[:page_size], "truncated": results.truncated,