Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Migrations Under The Hood
Search
Andrew Godwin
November 14, 2014
Programming
13k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Migrations Under The Hood
A talk I gave at Django Under The Hood 2014.
Andrew Godwin
November 14, 2014
More Decks by Andrew Godwin
See All by Andrew Godwin
Working With Risk: Lessons From Mountain Rescue
andrewgodwin
1
21
Reconciling Everything
andrewgodwin
1
420
Django Through The Years
andrewgodwin
0
350
Writing Maintainable Software At Scale
andrewgodwin
0
550
A Newcomer's Guide To Airflow's Architecture
andrewgodwin
0
440
Async, Python, and the Future
andrewgodwin
2
770
How To Break Django: With Async
andrewgodwin
1
850
Taking Django's ORM Async
andrewgodwin
0
880
The Long Road To Asynchrony
andrewgodwin
0
790
Other Decks in Programming
See All in Programming
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
810
Railsバージョンを4倍にした話
optim
0
730
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
3
540
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
960
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
4.7k
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
160
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
170
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
380
Kotlinの15年とServer-Side Kotlin
n_takehata
1
170
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
120
ChromeでローカルLLM
ryu1013
0
160
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
200
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
WENDY [Excerpt]
tessaabrams
14
40k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
330
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
860
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
810
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Statistics for Hackers
jakevdp
799
230k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
790
Transcript
Migrations UNDER THE HOOD Andrew Godwin Migrations
Andrew Godwin Author of South migrations library Hi, I'm Author
of 1.7 Django migrations Senior Software Engineer at Eventbrite Apparently at every Django conference
Migrations
Migrations
Other talks are available. This is a technical dive!
The Initial Plan Django Schema backend ORM Hooks South 2
Migration handling User interface
TheBRevisedBPlan Django SchemaBbackend ORMBHooks SouthB2 MigrationBhandling UserBinterface BackportBforB1.4B-B1.6
The Revised Revised Plan Django Schema backend ORM Hooks Migration
handling User interface
Logically Separate SchemaEditor Schema Migrations field.deconstruct() ModelOptions.apps Operations Loader /
Graph Executor Autodetector Optimiser State
Logically Separate SchemaEditor Schema Migrations field.deconstruct() ModelOptions.apps Operations Loader /
Graph Executor Autodetector Optimiser State
myapp/0001 myapp/0002 otherapp/0001 contenttypes/0001 appthree/0001 myapp/0003 otherapp/0002
(insert wavy memory effect!) Why do we need dependencies?
Makes all tables syncdb Sets all constraints Adds all ForeignKeys
Makes appA tables migrations Makes appB tables Adds FKs from
appB to appA Adds FKs from appA to appB
Makes appA tables migrations Makes appB tables Adds FKs from
appB to appA Adds FKs from appA to appB
The obvious stuff. Basic Dependencies
Or your database gets really mopey. FK target add before
FK added
In the general case; some DBs less fussy FK target
delete after FK deleted
Good luck doing it otherwise. Model create before field create
Also after field create Model delete after field alter
Stuff you occasionally forget Django has. Trickier Dependencies
And, of course, the reverse for deletion. M2M through model
before M2M
I'll let you figure out deletion reversals from now on.
MTI parent before MTI child
Index together, too Unique together after fields
Well done if you've actually used this feature. Order with
respect to after target
This happens when you turn proxies into real models. Same
delete before same create
Impossible dependencies
OH PLEASE NO TAKE IT AWAY 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 ??? argh
End of presentation. Click to exit.
They can't change at runtime, for swappable models or anything
else. Dependencies are static
(for a while, the answer was "careful function ordering") How
is it implemented?
no issues depend match shift operations restart
Using dependencies to define boundaries Chop operations into migrations
Optimisation
There's really quite a lot. Even more rules
create model + delete model = nothing create model +
create field = create model create field + alter field = create field alter field + delete field = delete field alter field + alter field = alter field
This time, with collapses rather than swaps Even more shuffling
can't reduce reduce possible check conflicts reduced, reset
Lets us be more verbose and clear with operations Applied
after autodetection
Makes your history a bit shorter Applied after squash
Loading & Graph
Builds graph of all basic migrations in memory Loads from
disk first
Marks applied state on each node Loads from db second
Only if all replaced nodes have same applied state Applies
squashes third
In-order list of all a node's ancestors in the tree
Graph returns "plans"
• Autodetector is slow • Optimizer is not great •
Graph state building is inefficient Room for improvement!
django/db/migrations/autodetector.py Autodetector django/db/migrations/optimizer.py Optimiser reduce()GfunctionGisGentryGforGlogic StartGatG_detect_changes()GandGfollowGcalls django/db/migrations/graph.py Graph django/db/migrations/loader.py
Thank you. Andrew Godwin @andrewgodwin