From 741e8f7fe563e18fe9a12ac1ce38157e8c903505 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 2 Aug 2018 08:17:29 -0700 Subject: [PATCH] Make .indexes compatible with older SQLite versions (#1) Older SQLite versions return a different set of columns from the PRAGMA we are using. --- sqlite_utils/db.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 0a05296..68ba132 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -37,6 +37,11 @@ class Database: def tables(self): return [self[name] for name in self.table_names] + def execute_returning_dicts(self, sql, params=None): + cursor = self.conn.execute(sql, params or tuple()) + keys = [d[0] for d in cursor.description] + return [dict(zip(keys, row)) for row in cursor.fetchall()] + def create_table(self, name, columns, pk=None, foreign_keys=None): foreign_keys = foreign_keys or [] foreign_keys_by_name = {fk[0]: fk for fk in foreign_keys} @@ -127,12 +132,23 @@ class Table: def indexes(self): sql = 'PRAGMA index_list("{}")'.format(self.name) indexes = [] - for row in list(self.db.conn.execute(sql).fetchall()): - column_sql = 'PRAGMA index_info("{}")'.format(row[1]) + for row in self.db.execute_returning_dicts(sql): + index_name = row["name"] + index_name_quoted = ( + '"{}"'.format(index_name) + if not index_name.startswith('"') + else index_name + ) + column_sql = "PRAGMA index_info({})".format(index_name_quoted) columns = [] for seqno, cid, name in self.db.conn.execute(column_sql).fetchall(): columns.append(name) - indexes.append(Index(*(row + (columns,)))) + row["columns"] = columns + # These coluns may be missing on older SQLite versions: + for key, default in {"origin": "c", "partial": 0}.items(): + if key not in row: + row[key] = default + indexes.append(Index(**row)) return indexes def create(self, columns, pk=None, foreign_keys=None):