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,6 +71,8 @@ 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
def collect_info(conn):
tables_to_insert = [] tables_to_insert = []
columns_to_delete = [] columns_to_delete = []
columns_to_insert = [] columns_to_insert = []
@ -84,7 +87,7 @@ async def populate_schema_tables(internal_db, db):
(database_name, table_name, table["rootpage"], table["sql"]) (database_name, table_name, table["rootpage"], table["sql"])
) )
columns_to_delete.append((database_name, table_name)) columns_to_delete.append((database_name, table_name))
columns = await db.table_column_details(table_name) columns = table_column_details(conn, table_name)
columns_to_insert.extend( columns_to_insert.extend(
{ {
**{"database_name": database_name, "table_name": table_name}, **{"database_name": database_name, "table_name": table_name},
@ -93,9 +96,9 @@ async def populate_schema_tables(internal_db, db):
for column in columns for column in columns
) )
foreign_keys_to_delete.append((database_name, table_name)) foreign_keys_to_delete.append((database_name, table_name))
foreign_keys = ( foreign_keys = conn.execute(
await db.execute(f"PRAGMA foreign_key_list([{table_name}])") f"PRAGMA foreign_key_list([{table_name}])"
).rows ).fetchall()
foreign_keys_to_insert.extend( foreign_keys_to_insert.extend(
{ {
**{"database_name": database_name, "table_name": table_name}, **{"database_name": database_name, "table_name": table_name},
@ -104,7 +107,7 @@ async def populate_schema_tables(internal_db, db):
for foreign_key in foreign_keys for foreign_key in foreign_keys
) )
indexes_to_delete.append((database_name, table_name)) indexes_to_delete.append((database_name, table_name))
indexes = (await db.execute(f"PRAGMA index_list([{table_name}])")).rows indexes = conn.execute(f"PRAGMA index_list([{table_name}])").fetchall()
indexes_to_insert.extend( indexes_to_insert.extend(
{ {
**{"database_name": database_name, "table_name": table_name}, **{"database_name": database_name, "table_name": table_name},
@ -112,6 +115,25 @@ async def populate_schema_tables(internal_db, db):
} }
for index in indexes 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(
""" """