From 9d19d8f66db131c9b72cdfd17315fcd97a9b7c06 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 2 Aug 2018 08:09:50 -0700 Subject: [PATCH 1/3] Fix for PRAGMA index_info with older SQLite It looks like that PRAGMA returns different columns on different SQLite versions. --- sqlite_utils/db.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 0a05296..24aafb9 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,19 @@ 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 + indexes.append(Index(**row)) return indexes def create(self, columns, pk=None, foreign_keys=None): From 3c849e97a68aeb5aff83895f1a9eb8e9e65f1d04 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 2 Aug 2018 08:12:57 -0700 Subject: [PATCH 2/3] Fix for older SQLite --- sqlite_utils/db.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 24aafb9..f6dab67 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -144,6 +144,10 @@ class Table: for seqno, cid, name in self.db.conn.execute(column_sql).fetchall(): columns.append(name) row["columns"] = columns + # These coluns may be missing on older SQLite versions: + for key in ("origin", "partial"): + if key not in row: + row[key] = None indexes.append(Index(**row)) return indexes From 9e674311065b8372f0a93becc8e7357ceffd353b Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Thu, 2 Aug 2018 08:15:53 -0700 Subject: [PATCH 3/3] Fix tests --- sqlite_utils/db.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index f6dab67..68ba132 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -145,9 +145,9 @@ class Table: columns.append(name) row["columns"] = columns # These coluns may be missing on older SQLite versions: - for key in ("origin", "partial"): + for key, default in {"origin": "c", "partial": 0}.items(): if key not in row: - row[key] = None + row[key] = default indexes.append(Index(**row)) return indexes