Optimize create table calls using executescript=True

Refs #1555, #1569
This commit is contained in:
Simon Willison 2021-12-18 10:30:53 -08:00
commit 2e4ba71b53
4 changed files with 18 additions and 43 deletions

View file

@ -95,7 +95,10 @@ class Database:
)
async def execute_write(self, sql, params=None, executescript=False, block=False):
assert not (executescript and params), "Cannot use params with executescript=True"
assert not (
executescript and params
), "Cannot use params with executescript=True"
def _inner(conn):
with conn:
if executescript:

View file

@ -2,22 +2,14 @@ import textwrap
async def init_internal_db(db):
await db.execute_write(
textwrap.dedent(
"""
create_tables_sql = textwrap.dedent(
"""
CREATE TABLE IF NOT EXISTS databases (
database_name TEXT PRIMARY KEY,
path TEXT,
is_memory INTEGER,
schema_version INTEGER
)
"""
),
block=True,
)
await db.execute_write(
textwrap.dedent(
"""
);
CREATE TABLE IF NOT EXISTS tables (
database_name TEXT,
table_name TEXT,
@ -25,14 +17,7 @@ async def init_internal_db(db):
sql TEXT,
PRIMARY KEY (database_name, table_name),
FOREIGN KEY (database_name) REFERENCES databases(database_name)
)
"""
),
block=True,
)
await db.execute_write(
textwrap.dedent(
"""
);
CREATE TABLE IF NOT EXISTS columns (
database_name TEXT,
table_name TEXT,
@ -46,14 +31,7 @@ async def init_internal_db(db):
PRIMARY KEY (database_name, table_name, name),
FOREIGN KEY (database_name) REFERENCES databases(database_name),
FOREIGN KEY (database_name, table_name) REFERENCES tables(database_name, table_name)
)
"""
),
block=True,
)
await db.execute_write(
textwrap.dedent(
"""
);
CREATE TABLE IF NOT EXISTS indexes (
database_name TEXT,
table_name TEXT,
@ -65,14 +43,7 @@ async def init_internal_db(db):
PRIMARY KEY (database_name, table_name, name),
FOREIGN KEY (database_name) REFERENCES databases(database_name),
FOREIGN KEY (database_name, table_name) REFERENCES tables(database_name, table_name)
)
"""
),
block=True,
)
await db.execute_write(
textwrap.dedent(
"""
);
CREATE TABLE IF NOT EXISTS foreign_keys (
database_name TEXT,
table_name TEXT,
@ -87,11 +58,10 @@ async def init_internal_db(db):
PRIMARY KEY (database_name, table_name, id, seq),
FOREIGN KEY (database_name) REFERENCES databases(database_name),
FOREIGN KEY (database_name, table_name) REFERENCES tables(database_name, table_name)
)
);
"""
),
block=True,
)
).strip()
await db.execute_write(create_tables_sql, block=True, executescript=True)
async def populate_schema_tables(internal_db, db):

View file

@ -950,7 +950,9 @@ def test_trace(trace_debug):
"select ",
)
for prefix in expected:
assert any(sql.startswith(prefix) for sql in sqls)
assert any(
sql.startswith(prefix) for sql in sqls
), "No trace beginning with: {}".format(prefix)
@pytest.mark.parametrize(

View file

@ -401,7 +401,7 @@ async def test_execute_write_executescript(db):
await db.execute_write(
"create table foo (id integer primary key); create table bar (id integer primary key); ",
executescript=True,
block=True
block=True,
)
table_names = await db.table_names()
assert {"foo", "bar"}.issubset(table_names)
@ -413,7 +413,7 @@ async def test_execute_write_executescript_not_allowed_with_params(db):
await db.execute_write(
"update roadside_attractions set name = ? where pk = ?",
["Mystery!", 1],
executescript=True
executescript=True,
)