Fix collecting SQL from schema editors while in transactions.

Review Request #12450 — Created July 10, 2022 and submitted

Information

Django Evolution
release-2.x

Reviewers

On Django 1.7 and higher, we utilize a database backend's
DatabaseSchemaEditor to generate a lot of our SQL. This is done by
putting the editor in SQL-collection mode, which tells it to record the
SQL statements it would use execute rather than executing them.

There's a design issue in SQLite's schema editor in Django 2.0 and
higher. Despite being put in SQL-collection mode, it will try to disable
foreign key checks and then check if it succeeded. If it did not (if,
say, in a transaction), it will immediately fail. This makes sense when
executing SQL, but not when collecting.

No other database backends have a check like this, so the failure case
was limited to SQLite.

There's no way to get around this through the standard usage of the
schema editor as a context manager, so instead we have to wrap it, put
it in the correct state, and collect the results ourselves.

This enables us to get the data we need without these side effects.

All call sites, including those that didn't explicitly put it into
SQL-collection mode (they weren't triggering calls that would have
executed SQL), now use the new wrapper function.

Unit tests pass for all versions of Django.

Summary ID
Fix collecting SQL from schema editors while in transactions.
On Django 1.7 and higher, we utilize a database backend's `DatabaseSchemaEditor` to generate a lot of our SQL. This is done by putting the editor in SQL-collection mode, which tells it to record the SQL statements it would use execute rather than executing them. There's a design issue in SQLite's schema editor in Django 2.0 and higher. Despite being put in SQL-collection mode, it will try to disable foreign key checks and then check if it succeeded. If it did not (if, say, in a transaction), it will immediately fail. This makes sense when executing SQL, but not when collecting. There's no way to get around this through the standard usage of the schema editor as a context manager, so instead we have to wrap it, put it in the correct state, and collect the results ourselves. This enables us to get the data we need without these side effects.
f051985078fef9c16bc892634a6302ab46c5c5f9
david
  1. Ship It!
  2. 
      
chipx86
Review request changed
Status:
Completed
Change Summary:
Pushed to release-2.x (9bcae79)