Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Database Migrations, South, And You

Database Migrations, South, And You

A talk I gave at DjangoCon US 2009

Andrew Godwin

September 08, 2009
Tweet

More Decks by Andrew Godwin

Other Decks in Programming

Transcript

  1. database�migrations,
    southand�you
    Andrew�Godwin
    [email protected]

    View Slide

  2. What�are�migrations?
    http://www.flickr.com/photos/moonjazz/1216783552/

    View Slide

  3. They're�NOT�moving�data�from�
    one�database�to�another.
    http://www.flickr.com/photos/shindotv/3835365427/

    View Slide

  4. Better�name:�Schema�Evolution.
    http://www.flickr.com/photos/fmc550uz/3562899067/

    View Slide

  5. Django�has�nothing�built-in.

    View Slide

  6. +
    +
    =

    View Slide

  7. +
    +
    =
    Migration�1:�Creates�table�A
    Migration�2:�Creates�table�B
    Migration�3:�Adds�field�to�A,
    ������������������������creates�t able�C
    Apply�each�in�order,�get�current�schema

    View Slide

  8. One�set�of�migrations�per�app.
    http://www.flickr.com/photos/dan_h/2517103627/

    View Slide

  9. Apps�aren't�really�independent.
    http://www.flickr.com/photos/johnbullas/3301805150/

    View Slide

  10. View Slide

  11. View Slide

  12. Is�your�app�fresh,�or�old?
    http://www.flickr.com/photos/matthewfch/536763437/

    View Slide

  13. Fresh?
    -�Populate�appname/models.py
    -�Make�your�initial�migration:
    ./manage.py startmigration appname --initial
    -�Apply�that�migration
    ./manage.py migrate appname

    View Slide

  14. Already�syncdb'd?
    -�Locally,�run:
    ./manage.py convert_to_south appname
    -�Commit,�and�then�on�others�do:
    ./manage.py migrate --fake appname 0001
    (see:�south.aeracode.org/wiki/ConvertingAnApp)

    View Slide

  15. Migrations�are�flexible.
    http://www.flickr.com/photos/dunechaser/2630434670/

    View Slide

  16. Autodetection
    ./manage.py startmigration \
    --auto appname added_some_column
    Use�the�autodetector
    Name�of�the�app
    Suffix�of�the�new�migration

    View Slide

  17. class Migration:
    def forwards(self, orm):
    # Adding field 'Adopter.lizard2'
    db.add_column('southdemo_adopter', 'lizard2',
    orm['southdemo.adopter:lizard2'])
    def backwards(self, orm):
    # Deleting field 'Adopter.lizard2'
    db.delete_column('southdemo_adopter',
    'lizard2_id')

    View Slide

  18. We�'freeze'�model�definitions.
    http://www.flickr.com/photos/stuckincustoms/3410783929/

    View Slide

  19. models = {
    'southdemo.adopter' : {
    'first_name': (
    'django.db.models.fields.CharField' ,
    [],
    {'max_length': '50'}
    ),
    'lizard': (
    'django.db.models.fields.related.ForeignKey' ,
    [],
    {
    'related_name' : "'adopters'",
    'to': "orm['southdemo.Lizard']"
    }
    ),
    ...
    }

    View Slide

  20. We�migrate�data,�too.
    http://www.flickr.com/photos/ian-s/2152798588/

    View Slide

  21. def forwards(self, orm):
    for adopter in orm.Adopter.objects.all():
    try:
    adopter.first_name, adopter.last_name = \
    adopter.name.split( " ", 1)
    except ValueError :
    adopter.first_name, adopter.last_name = \
    adopter.name, ""
    adopter.save()

    View Slide

  22. Roll�your�own�migrations.
    http://www.flickr.com/photos/thomashawk/93819794/

    View Slide

  23. Unit�test�integration,�if�you�want
    http://www.flickr.com/photos/cobalt/409924867/

    View Slide

  24. The�Future�World�Of�Tomorrow
    http://www.flickr.com/photos/stuckincustoms/211566219/

    View Slide

  25. Thanks�for�listening.
    http://www.flickr.com/photos/sovietuk/378834721/
    http://south.aeracode.org
    Andrew�Godwin
    [email protected]

    View Slide

  26. Thanks�for�listening.
    http://www.flickr.com/photos/sovietuk/378834721/
    http://south.aeracode.org
    Andrew�Godwin
    [email protected]
    @andrewgodwin

    View Slide