Standalone PR now at https://github.com/django/django/pull/4122.

Alex

On Thursday, February 12, 2015 at 12:09:39 PM UTC+8, Alex Hill wrote:
>
> Hi all, doing a bit of yak shaving here.
>
> I'm currently refactoring Django's lazy operations [0], and ran into a bit 
> of a snag which led me to make some changes to SQLite's schema editor. All 
> the tests pass, but I thought I should bring this up here to get a few more 
> eyeballs on my changes since it's a pretty critical bit of Django 
> infrastructure.
>
> Here's the relevant change: 
> https://github.com/AlexHill/django/commit/d27869e3dcb03eccf7c3aa09d911b5206bda9d0a
>
> *Explanation:*
> SQLite requires creating a new table for many schema alterations.
>
> At present the process is:
>
>    1. define a dummy model with the updated definition and table name 
>    "app_model__new"
>    2. create that model's table
>    3. copy the data from "app_model" into "app_model__new"
>    4. delete the "app_model" table
>    5. rename "app_model__new" to "app_model"
>
> Consider a model with a foreign key to self called "parent". In master, 
> that field on the dummy model actually points to the original model, with 
> the correct table name. After the refactor, the dummy model is internally 
> consistent, i.e. its parent field points at itself, with its temporary 
> table name. After you create the new table "app_model__new" and rename it 
> to "app_model", its definition is left with a dangling reference to 
> "app_model__new".
>
> An equivalent way to do this is:
>
>    1. define a dummy model with the updated definition and the existing 
>    table name "app_model"
>    2. rename "app_model" to "app_model__old"
>    3. create the dummy model's table
>    4. copy the data from "app_model__old" to "app_model"
>    5. delete the "app_model__old" table
>    
> This avoids ever having a model with a db_table set to the temporary table 
> name. As well as fixing my problem, this seems a little more 
> straightforward – there's a bit of awkward search-and-replace happening 
> with the "__new" table name in the schema editor which we avoid this way.
>
> Cheers,
> Alex
>
> [0] https://code.djangoproject.com/ticket/24215
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/9d2b55ba-9119-46ca-9718-505d3c437658%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to