Compare commits

...

3 commits

Author SHA1 Message Date
Simon Willison
9e67431106 Fix tests 2018-08-02 08:15:53 -07:00
Simon Willison
3c849e97a6 Fix for older SQLite 2018-08-02 08:12:57 -07:00
Simon Willison
9d19d8f66d Fix for PRAGMA index_info with older SQLite
It looks like that PRAGMA returns different columns on different SQLite versions.
2018-08-02 08:09:50 -07:00

View file

@ -37,6 +37,11 @@ class Database:
def tables(self): def tables(self):
return [self[name] for name in self.table_names] 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): def create_table(self, name, columns, pk=None, foreign_keys=None):
foreign_keys = foreign_keys or [] foreign_keys = foreign_keys or []
foreign_keys_by_name = {fk[0]: fk for fk in foreign_keys} foreign_keys_by_name = {fk[0]: fk for fk in foreign_keys}
@ -127,12 +132,23 @@ class Table:
def indexes(self): def indexes(self):
sql = 'PRAGMA index_list("{}")'.format(self.name) sql = 'PRAGMA index_list("{}")'.format(self.name)
indexes = [] indexes = []
for row in list(self.db.conn.execute(sql).fetchall()): for row in self.db.execute_returning_dicts(sql):
column_sql = 'PRAGMA index_info("{}")'.format(row[1]) 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 = [] columns = []
for seqno, cid, name in self.db.conn.execute(column_sql).fetchall(): for seqno, cid, name in self.db.conn.execute(column_sql).fetchall():
columns.append(name) 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 return indexes
def create(self, columns, pk=None, foreign_keys=None): def create(self, columns, pk=None, foreign_keys=None):