I got this error trying to drop a column from a table that was part of a SQL view:
error in view plugins: no such table: main.pypi_releases
Upon further investigation I found that this pattern seemed to fix it:
def transform_the_table(conn):
# Run this in a transaction:
with conn:
# We have to read all the views first, because we need to drop and recreate them
db = sqlite_utils.Database(conn)
views = {v.name: v.schema for v in db.views if table.lower() in v.schema.lower()}
for view in views.keys():
db[view].drop()
db[table].transform(
types=types,
rename=rename,
drop=drop,
column_order=[p[0] for p in order_pairs],
)
# Now recreate the views
for name, schema in views.items():
db.create_view(name, schema)
So grab a copy of any view that might reference this table, start a transaction, drop those views, run the transform, recreate the views again.
I wonder if this should become an option in sqlite-utils? Maybe a recreate_views=True argument for table.tranform(...)? Should it be opt-in or opt-out?
Originally posted by @simonw in simonw/datasette-edit-schema#35 (comment)
I got this error trying to drop a column from a table that was part of a SQL view:
Upon further investigation I found that this pattern seemed to fix it:
So grab a copy of any view that might reference this table, start a transaction, drop those views, run the transform, recreate the views again.
Originally posted by @simonw in simonw/datasette-edit-schema#35 (comment)