Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Django�has�nothing�built-in.

Slide 6

Slide 6 text

+ + =

Slide 7

Slide 7 text

+ + = 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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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)

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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')

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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']" } ), ... }

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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()

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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