Use rowid if no primary key available

Allows us to link to individual records even for tables that do not have a primary key.

Refs #5
pull/81/head
Simon Willison 2017-11-09 06:39:50 -08:00
rodzic b2dee11fcd
commit d9fa2bf7ba
2 zmienionych plików z 33 dodań i 16 usunięć

Wyświetl plik

@ -248,20 +248,27 @@ class TableView(BaseView):
async def data(self, request, name, hash, table):
table = urllib.parse.unquote_plus(table)
pks = await self.pks_for_table(name, table)
use_rowid = not pks
select = '*'
if use_rowid:
select = 'rowid, *'
if request.args:
where_clause, params = build_where_clause(request.args)
sql = 'select * from "{}" where {} limit 50'.format(
table, where_clause
sql = 'select {} from "{}" where {} limit 50'.format(
select, table, where_clause
)
else:
sql = 'select * from "{}" limit 50'.format(table)
sql = 'select {} from "{}" limit 50'.format(select, table)
params = []
rows = await self.execute(name, sql)
columns = [r[0] for r in rows.description]
display_columns = columns
if use_rowid:
display_columns = display_columns[1:]
rows = list(rows)
pks = await self.pks_for_table(name, table)
info = ensure_build_metadata(self.files)
total_rows = info[name]['tables'].get(table)
return {
@ -273,7 +280,9 @@ class TableView(BaseView):
'primary_keys': pks,
}, lambda: {
'database_hash': hash,
'row_link': lambda row: path_from_row_pks(row, pks),
'use_rowid': use_rowid,
'row_link': lambda row: path_from_row_pks(row, pks, use_rowid),
'display_columns': display_columns,
}
@ -284,12 +293,17 @@ class RowView(BaseView):
table = urllib.parse.unquote_plus(table)
pk_values = compound_pks_from_path(pk_path)
pks = await self.pks_for_table(name, table)
use_rowid = not pks
select = '*'
if use_rowid:
select = 'rowid, *'
pks = ['rowid']
wheres = [
'"{}"=:p{}'.format(pk, i)
for i, pk in enumerate(pks)
]
sql = 'select * from "{}" where {}'.format(
table, ' AND '.join(wheres)
sql = 'select {} from "{}" where {}'.format(
select, table, ' AND '.join(wheres)
)
params = {}
for i, pk_value in enumerate(pk_values):
@ -351,9 +365,9 @@ def compound_pks_from_path(path):
]
def path_from_row_pks(row, pks):
if not pks:
return ''
def path_from_row_pks(row, pks, use_rowid):
if use_rowid:
return urllib.parse.quote_plus(str(row['rowid']))
bits = []
for pk in pks:
bits.append(

Wyświetl plik

@ -8,6 +8,9 @@
<h2>{{ table }}{% if total_rows != None %} ({{ "{:,}".format(total_rows) }} total row{% if total_rows == 1 %}{% else %}s{% endif %} in this table){% endif %}</h2>
<style>
th {
padding-right: 1em;
}
td {
white-space: pre;
vertical-align: top;
@ -17,16 +20,16 @@ td {
</style>
<table>
<tr>
{% if primary_keys and row_link %}<th scope="col">Link</th>{% endif %}
{% for column in columns %}<th scope="col">{{ column }}</th>{% endfor %}
<th scope="col">{% if use_rowid %}rowid{% else %}Link{% endif %}</th>
{% for column in display_columns %}<th scope="col">{{ column }}</th>{% endfor %}
</tr>
{% for row in rows %}
<tr>
{% if primary_keys and row_link %}
<td><a href="/{{ database }}-{{ database_hash }}/{{ table }}/{{ row_link(row) }}">{{ row_link(row) }}</a></td>
{% endif %}
<td><a href="/{{ database }}-{{ database_hash }}/{{ table }}/{{ row_link(row) }}">{{ row_link(row) }}</a></td>
{% for td in row %}
<td>{{ td }}</td>
{% if not use_rowid or (use_rowid and not loop.first) %}
<td>{{ td }}</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}