Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Digging Into Django's Migrations
Andrew Godwin
September 03, 2014
Programming
3
530
Digging Into Django's Migrations
My keynote from DjangoCon US 2014
Andrew Godwin
September 03, 2014
Tweet
Share
More Decks by Andrew Godwin
See All by Andrew Godwin
A Newcomer's Guide To Airflow's Architecture
andrewgodwin
0
98
Async, Python, and the Future
andrewgodwin
1
370
How To Break Django: With Async
andrewgodwin
1
310
Taking Django's ORM Async
andrewgodwin
0
340
The Long Road To Asynchrony
andrewgodwin
0
380
The Scientist & The Engineer
andrewgodwin
1
380
Pioneering Real-Time
andrewgodwin
0
150
Just Add Await: Retrofitting Async Into Django
andrewgodwin
2
1.1k
Terrain, Art, Python and LiDAR
andrewgodwin
1
240
Other Decks in Programming
See All in Programming
Java初心者が知っておくべきプログラミングのこと - JJUG CCC 2022 Spring
kishida
5
540
[DevTrends - Jun/2022] Arquitetura baseada em eventos
camilacampos
0
120
Node.jsデザインパターンを読んで
mmmommm
0
2.5k
#JJUG_CCC 「サポート」は製品開発? - JDBCライブラリ屋さんが実践する攻めのテクニカルサポートとJavaエンジニアのキャリアについて -
cdataj
0
420
Reactive Java Microservices on Kubernetes with Spring and JHipster
deepu105
1
170
Mobile Product Engineering
championswimmer
0
300
From Java through Scala to Clojure
lagenorhynque
0
190
ISUCON12 事前講習
rosylilly
3
4.3k
BASE BANKチームの技術選定と歴史 / how to decide technology selection for startup
budougumi0617
0
240
Oracle REST Data Service: APEX Office Hours
thatjeffsmith
0
720
Airflowはすごいぞ!
hankehly
0
370
Branching out to Jetpack Compose
chrisbanes
4
1.2k
Featured
See All Featured
Documentation Writing (for coders)
carmenhchung
48
2.5k
Designing the Hi-DPI Web
ddemaree
272
32k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
119
28k
What’s in a name? Adding method to the madness
productmarketing
11
1.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
17k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
Code Review Best Practice
trishagee
43
9.2k
It's Worth the Effort
3n
172
25k
Visualization
eitanlees
124
11k
Clear Off the Table
cherdarchuk
79
280k
Git: the NoSQL Database
bkeepers
PRO
415
59k
Building an army of robots
kneath
299
40k
Transcript
's migrations digging into
Andrew Godwin Author of South migrations library Hi, I'm Author
of 1.7 Django migrations Senior Software Engineer at
south migrations for django south.aeracode.org DjangoCon 2008 https://speakerdeck.com/andrewgodwin/south-migrations-for-django
Migrations: They're pretty good.
South 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 1.0
Aug 2008 Aug 2008 Sep 2008 Jan 2009 Apr 2009 Jun 2009 Mar 2010 May 2013 Jul 2014
The Early Years 0.1 0.2 0.3 0.4 0.5 0.6 0.7
0.8 1.0 Aug 2008 Aug 2008 Sep 2008 Jan 2009 Apr 2009 Jun 2009 Mar 2010 May 2013 Jul 2014
Approaching Stability 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8
1.0 Aug 2008 Aug 2008 Sep 2008 Jan 2009 Apr 2009 Jun 2009 Mar 2010 May 2013 Jul 2014 Well, in the short term, South 1.0 will be released. “ “ June 2010
The Long Gap & Kickstarter 0.1 0.2 0.3 0.4 0.5
0.6 0.7 0.8 1.0 Aug 2008 Aug 2008 Sep 2008 Jan 2009 Apr 2009 Jun 2009 Mar 2010 May 2013 Jul 2014
Today 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 1.0
Aug 2008 Aug 2008 Sep 2008 Jan 2009 Apr 2009 Jun 2009 Mar 2010 May 2013 Jul 2014
For at least a year now, people have been suggesting
to me that South should be in Django core. “ “ June 2010
The Initial Plan Django Schema backend ORM Hooks South 2
Migration handling User interface
The Revised Plan Django Schema backend ORM Hooks South 2
Migration handling User interface Backport for 1.4 - 1.6
The Revised Revised Plan Django Schema backend ORM Hooks Migration
handling User interface
Moving South into Django instead, "Adding migrations to Django"
Logically Separate SchemaEditor Schema Migrations field.deconstruct() ModelOptions.apps Operations Loader /
Graph Executor Autodetector Optimiser State
Operations & State
Operations are a declarative representation of model changes State is
an in-memory representation of entire project state
State State Operation AddModel No Models 1 Model
State State Operation State Operation State Operation State Operation Migration
1 Migration 2
AddModel DeleteModel RenameModel AddField DeleteField AlterModelOptions RenameField AlterModelTable AlterField AlterUniqueTogether
AlterIndexTogether RunSQL RunPython
SchemaEditor
connection.schema_editor() Abstraction over database DDL Takes Django models and fields
with connection.schema_editor() as ed: ed.create_model(Author) ed.add_field( Book, "author", models.ForeignKey(Author), )
Field Deconstruction
Every field has deconstruct() Returns arguments passed to __init__ to
duplicate itself
>>> field = CharField(max_length=255) >>> field.deconstruct() ( None, 'django.db.models.CharField', [],
{'max_length': 255} )
The Graph
Represents migrations and dependencies as directed graph Loop detection, leaf/root
selection
myapp/0001 myapp/0002 otherapp/0001 contenttypes/0001 appthree/0001 myapp/0003 otherapp/0002
The Autodetector
Compares two States and outputs a set of operations to
perform Operations have own dependencies and resolver
Model A Model A w/FK, Model B diff AddModel(B) AddField(A,
"b", FK(B)) dependency sort AddModel(B) AddField(A, "b", FK(B)) BEFORE AFTER
The Optimiser
Takes one set of Operations and outputs another with the
same effect Steps over pairs and checks if they combine and what they pass over
can't reduce reduce possible check conflicts reduced, reset
A New Format More concise Declarative Introspectable
Migration actions Frozen ORM
None
makemigrations field.deconstruct() Loader / Graph Autodetector Optimiser State Writer 1
2 State 3 5 4
migrate SchemaEditor ModelOptions.apps Operations Loader / Graph Executor State 1
2 Recorder 3
In-memory running Creates models from migration sets Autodetector diffs created
from on-disk Used to feed SchemaEditor / ORM
State State Operation State Operation State Operation State Operation Migration
1 Migration 2 Models Models Render Render
But what went wrong?
Swappable Models
Your migration dependencies myapp/0001 myapp/0002 otherapp/0001 auth/0001 contenttypes/0001
myapp/0001 myapp/0002 otherapp/0001 auth/0001 contenttypes/0001 thirdapp/0001 Your migration dependencies on
swappable models
what? Your migration dependencies on swappable models myapp/0001 myapp/0002 otherapp/0001
auth/0001 contenttypes/0001 thirdapp/0001 ???
what? Your migration dependencies on swappable models myapp/0001 myapp/0002 otherapp/0001
auth/0001 contenttypes/0001 thirdapp/0001 ???
Unmigrated Apps
Test persistence
Test persistence on MySQL
Random Meta options order_with_respect_to? Really?
Proxy Models
But we're there! Django 1.7, out now!
Thanks! Andrew Godwin andrewgodwin@eventbrite.com