From 1c8638c30ae9b1e59dd045cf6d0b20e6dc630e5b Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Wed, 22 Nov 2017 12:12:15 -0800 Subject: [PATCH] Hide FTS-created tables on index pages Closes #129 --- datasette/app.py | 40 +++++++++++++++---------------- datasette/static/app.css | 4 ++++ datasette/templates/database.html | 10 ++++++-- datasette/templates/index.html | 13 ++++++++-- 4 files changed, 43 insertions(+), 24 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index e7ed578f..6ce8c35e 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -267,18 +267,23 @@ class IndexView(HTTPMethodView): async def get(self, request, as_json): databases = [] for key, info in sorted(self.ds.inspect().items()): + tables = [t for t in info['tables'].values() if not t['hidden']] + hidden_tables = [t for t in info['tables'].values() if t['hidden']] database = { 'name': key, 'hash': info['hash'], 'path': '{}-{}'.format(key, info['hash'][:7]), 'tables_truncated': sorted( - info['tables'].items(), - key=lambda p: p[1]['count'], + tables, + key=lambda t: t['count'], reverse=True )[:5], - 'tables_count': len(info['tables'].items()), - 'tables_more': len(info['tables'].items()) > 5, - 'table_rows': sum([t['count'] for t in info['tables'].values()]), + 'tables_count': len(tables), + 'tables_more': len(tables) > 5, + 'table_rows': sum(t['count'] for t in tables), + 'hidden_table_rows': sum(t['count'] for t in hidden_tables), + 'hidden_tables_count': len(hidden_tables), + 'views_count': len(info['views']), } databases.append(database) if as_json: @@ -313,26 +318,17 @@ class DatabaseView(BaseView): async def data(self, request, name, hash): if request.args.get('sql'): return await self.custom_sql(request, name, hash) - tables = [] - table_inspect = self.ds.inspect()[name]['tables'] - for table_name, info in table_inspect.items(): - rows = await self.execute( - name, - 'PRAGMA table_info([{}]);'.format(table_name) - ) - tables.append({ - 'name': table_name, - 'columns': [r[1] for r in rows], - 'table_rows': info['count'], - }) - tables.sort(key=lambda t: t['name']) - views = await self.execute(name, 'select name from sqlite_master where type = "view"') + info = self.ds.inspect()[name] + tables = list(info['tables'].values()) + tables.sort(key=lambda t: (t['hidden'], t['name'])) return { 'database': name, 'tables': tables, - 'views': [v[0] for v in views], + 'hidden_count': len([t for t in tables if t['hidden']]), + 'views': info['views'], }, { 'database_hash': hash, + 'show_hidden': request.args.get('_show_hidden'), } async def custom_sql(self, request, name, hash): @@ -760,12 +756,14 @@ class Datasette: m.update(data) # List tables and their row counts tables = {} + views = [] with sqlite3.connect('file:{}?immutable=1'.format(path), uri=True) as conn: conn.row_factory = sqlite3.Row table_names = [ r['name'] for r in conn.execute('select * from sqlite_master where type="table"') ] + views = [v[0] for v in conn.execute('select name from sqlite_master where type = "view"')] for table in table_names: count = conn.execute( 'select count(*) from {}'.format(escape_sqlite_table_name(table)) @@ -810,6 +808,8 @@ class Datasette: 'hash': m.hexdigest(), 'file': str(path), 'tables': tables, + 'views': views, + } return self._inspect diff --git a/datasette/static/app.css b/datasette/static/app.css index b05782da..a3685c65 100644 --- a/datasette/static/app.css +++ b/datasette/static/app.css @@ -82,6 +82,10 @@ table a:visited { margin-bottom: 0; } +h2 em { + font-style: normal; + font-weight: lighter; +} form.sql textarea { border: 1px solid #ccc; width: 70%; diff --git a/datasette/templates/database.html b/datasette/templates/database.html index cdf128b8..8b7f7bdd 100644 --- a/datasette/templates/database.html +++ b/datasette/templates/database.html @@ -65,13 +65,19 @@ {% endif %} {% for table in tables %} +{% if show_hidden or not table.hidden %}
-

{{ table.name }}

+

{{ table.name }}{% if table.hidden %} (hidden){% endif %}

{% for column in table.columns[:9] %}{{ column }}{% if not loop.last %}, {% endif %}{% endfor %}{% if table.columns|length > 9 %}...{% endif %}

-

{{ "{:,}".format(table.table_rows) }} row{% if table.table_rows == 1 %}{% else %}s{% endif %}

+

{{ "{:,}".format(table.count) }} row{% if table.count == 1 %}{% else %}s{% endif %}

+{% endif %} {% endfor %} +{% if hidden_count and not show_hidden %} +

... and {{ "{:,}".format(hidden_count) }} hidden table{% if hidden_count == 1 %}{% else %}s{% endif %}

+{% endif %} + {% if views %}

Views