Optimize init_internal_db by running PRAGMA in a single function

Refs #1555
pull/1589/head
Simon Willison 2021-12-18 19:49:11 -08:00
rodzic d637ed4676
commit 97b1723dd0
1 zmienionych plików z 62 dodań i 40 usunięć

Wyświetl plik

@ -1,4 +1,5 @@
import textwrap import textwrap
from datasette.utils import table_column_details
async def init_internal_db(db): async def init_internal_db(db):
@ -70,49 +71,70 @@ async def populate_schema_tables(internal_db, db):
"DELETE FROM tables WHERE database_name = ?", [database_name], block=True "DELETE FROM tables WHERE database_name = ?", [database_name], block=True
) )
tables = (await db.execute("select * from sqlite_master WHERE type = 'table'")).rows tables = (await db.execute("select * from sqlite_master WHERE type = 'table'")).rows
tables_to_insert = []
columns_to_delete = []
columns_to_insert = []
foreign_keys_to_delete = []
foreign_keys_to_insert = []
indexes_to_delete = []
indexes_to_insert = []
for table in tables: def collect_info(conn):
table_name = table["name"] tables_to_insert = []
tables_to_insert.append( columns_to_delete = []
(database_name, table_name, table["rootpage"], table["sql"]) columns_to_insert = []
) foreign_keys_to_delete = []
columns_to_delete.append((database_name, table_name)) foreign_keys_to_insert = []
columns = await db.table_column_details(table_name) indexes_to_delete = []
columns_to_insert.extend( indexes_to_insert = []
{
**{"database_name": database_name, "table_name": table_name}, for table in tables:
**column._asdict(), table_name = table["name"]
} tables_to_insert.append(
for column in columns (database_name, table_name, table["rootpage"], table["sql"])
) )
foreign_keys_to_delete.append((database_name, table_name)) columns_to_delete.append((database_name, table_name))
foreign_keys = ( columns = table_column_details(conn, table_name)
await db.execute(f"PRAGMA foreign_key_list([{table_name}])") columns_to_insert.extend(
).rows {
foreign_keys_to_insert.extend( **{"database_name": database_name, "table_name": table_name},
{ **column._asdict(),
**{"database_name": database_name, "table_name": table_name}, }
**dict(foreign_key), for column in columns
} )
for foreign_key in foreign_keys foreign_keys_to_delete.append((database_name, table_name))
) foreign_keys = conn.execute(
indexes_to_delete.append((database_name, table_name)) f"PRAGMA foreign_key_list([{table_name}])"
indexes = (await db.execute(f"PRAGMA index_list([{table_name}])")).rows ).fetchall()
indexes_to_insert.extend( foreign_keys_to_insert.extend(
{ {
**{"database_name": database_name, "table_name": table_name}, **{"database_name": database_name, "table_name": table_name},
**dict(index), **dict(foreign_key),
} }
for index in indexes for foreign_key in foreign_keys
)
indexes_to_delete.append((database_name, table_name))
indexes = conn.execute(f"PRAGMA index_list([{table_name}])").fetchall()
indexes_to_insert.extend(
{
**{"database_name": database_name, "table_name": table_name},
**dict(index),
}
for index in indexes
)
return (
tables_to_insert,
columns_to_delete,
columns_to_insert,
foreign_keys_to_delete,
foreign_keys_to_insert,
indexes_to_delete,
indexes_to_insert,
) )
(
tables_to_insert,
columns_to_delete,
columns_to_insert,
foreign_keys_to_delete,
foreign_keys_to_insert,
indexes_to_delete,
indexes_to_insert,
) = await db.execute_fn(collect_info)
await internal_db.execute_write_many( await internal_db.execute_write_many(
""" """
INSERT INTO tables (database_name, table_name, rootpage, sql) INSERT INTO tables (database_name, table_name, rootpage, sql)