From edb36629e7356f70f42b9d37fea5dfe9cc3c364a Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Mon, 27 May 2019 11:41:44 -0700 Subject: [PATCH] Database.get_outbound_foreign_keys() refactor Following this, the only module that ever makes calls to the low-level execute_against_connection_in_thread() method is datasette/database.py --- datasette/database.py | 5 +++++ datasette/facets.py | 11 ++++------- datasette/views/table.py | 13 ++++--------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/datasette/database.py b/datasette/database.py index 45006cbe..5fac4925 100644 --- a/datasette/database.py +++ b/datasette/database.py @@ -205,6 +205,11 @@ class Database: self.name, get_all_foreign_keys ) + async def get_outbound_foreign_keys(self, table): + return await self.ds.execute_against_connection_in_thread( + self.name, lambda conn: get_outbound_foreign_keys(conn, table) + ) + async def get_table_definition(self, table, type_="table"): table_definition_rows = list( await self.ds.execute( diff --git a/datasette/facets.py b/datasette/facets.py index 7d7bd6d4..c37bb650 100644 --- a/datasette/facets.py +++ b/datasette/facets.py @@ -4,7 +4,6 @@ import re from datasette import hookimpl from datasette.utils import ( escape_sqlite, - get_all_foreign_keys, path_with_added_args, path_with_removed_args, detect_json1, @@ -486,9 +485,8 @@ class ManyToManyFacet(Facet): # This is calculated based on foreign key relationships to this table # Are there any many-to-many tables pointing here? suggested_facets = [] - all_foreign_keys = await self.ds.execute_against_connection_in_thread( - self.database, get_all_foreign_keys - ) + db = self.ds.databases[self.database] + all_foreign_keys = await db.get_all_foreign_keys() if not all_foreign_keys.get(self.table): # It's probably a view return [] @@ -528,9 +526,8 @@ class ManyToManyFacet(Facet): facets_timed_out = [] args = set(self.get_querystring_pairs()) facet_size = self.ds.config("default_facet_size") - all_foreign_keys = await self.ds.execute_against_connection_in_thread( - self.database, get_all_foreign_keys - ) + db = self.ds.databases[self.database] + all_foreign_keys = await db.get_all_foreign_keys() if not all_foreign_keys.get(self.table): return [], [] # We care about three tables: self.table, middle_table and destination_table diff --git a/datasette/views/table.py b/datasette/views/table.py index 2d704670..e109856a 100644 --- a/datasette/views/table.py +++ b/datasette/views/table.py @@ -14,8 +14,6 @@ from datasette.utils import ( compound_keys_after_sql, escape_sqlite, filters_should_redirect, - get_all_foreign_keys, - get_outbound_foreign_keys, is_url, path_from_row_pks, path_with_added_args, @@ -293,9 +291,8 @@ class TableView(RowTableShared): through_table = through_data["table"] other_column = through_data["column"] value = through_data["value"] - outgoing_foreign_keys = await self.ds.execute_against_connection_in_thread( - database, - lambda conn: get_outbound_foreign_keys(conn, through_table), + outgoing_foreign_keys = await db.get_outbound_foreign_keys( + through_table ) try: fk_to_us = [ @@ -843,10 +840,8 @@ class RowView(RowTableShared): async def foreign_key_tables(self, database, table, pk_values): if len(pk_values) != 1: return [] - - all_foreign_keys = await self.ds.execute_against_connection_in_thread( - database, get_all_foreign_keys - ) + db = self.ds.databases[database] + all_foreign_keys = await db.get_all_foreign_keys() foreign_keys = all_foreign_keys[table]["incoming"] if len(foreign_keys) == 0: return []