SlideShare a Scribd company logo
Nashville symfony Group




The Art of Doctrine Migrations
           Feb 2nd, 2010


          Ryan Weaver
          @weaverryan
          iostudio.com
       www.thatsquality.com
Nashville symfony Group Feb 2010



So you've updated your code, now to update
 your database...
  
      PhpMyAdmin: post-it notes, pizza & beer
  
      SQL deltas:
      
        Pros: familiar syntax, tools available
      
        Cons: not systematic, db-specific, disconnected from ORM
  
      Doctrine Migrations:
      
        Pros: systematic, generate automatically, written in Nashville
        (probably)
      
        Cons: were a pain in the ass (until now), still a bit quirky
Nashville symfony Group Feb 2010


    A PHP file with simple
    directions on how to
    update your database

   Each file is prefixed by a
   number, which determines
   its ordering:

   /lib/migration/doctrine/
      
        1_add_brilliant_idea_table.php
      
        2_add_good_people_table.php
      
        3_add_desc_field_to_idea.php
Nashville symfony Group Feb 2010


Tracking Versions

Doctrine keeps track of
your db's “version” via
migration_version table



/lib/migration/doctrine/
   
     1_add_brilliant_idea_table.php           version 1
   
     2_add_good_people_table.php              version 2
   
     3_add_desc_field_to_idea.php             version 3
   
     4_modify_some_column.php                 version 4
   
     35_alternatively_numbered.php            version 5
Nashville symfony Group Feb 2010


Take a deep breath and migrate:
     ./symfony doctrine:migrate [migration #]
Nashville symfony Group Feb 2010


Writing Migrations
Create a blank migration file:
    doctrine:generate-migration name
 
     Creates a blank file in lib/migration/doctrine
      (e.g. 1265085881_add_another_table.php)
 
  Use the rich API to
 make changes




 www.doctrine-project.org/Doctrine-
      Cheat-Sheet-1.1.pdf
Nashville symfony Group Feb 2010




Or just generate the migrations automatically...
Nashville symfony Group Feb 2010


Generate Migrations
For an existing database & project with no migrations:
     doctrine:generate-migrations-db

• Generates migration classes for everything to date
• For example, for a project with 75 tables, this would generate
  76 migration classes
• (1 per table + 1 giant class for all indexes and foreign keys)


  This gets you “caught up”, but only works once.
Nashville symfony Group Feb 2010


Migration-diff tool
Generates new migration class(es) based on some schema
  change

1) Make a change to your schema (e.g. add a column)
2) Run the diff tool task:
     doctrine:generate-migrations-diff
3) Rebuild your model
     doctrine:build --all

This runs a “diff” between your new schema and your
old model files.
Lame/Warning: If you rebuild your model before running the diff
tool, no changes will be recognized
Nashville symfony Group Feb 2010


Filename Conventions
Generated migrations take one of these 2 forms:
       263866565_migration_name.php
       263866565_version15.php
We recommend renaming to include the version #:
      version1_migration_name.php
      263866565_version15.php
Nashville symfony Group Feb 2010


Model Name Conventions
Generated migrations take one of these 2 forms:
       class Version15
       class MigrationName

We recommend naming the class by the version #:
        class Version 15
Nashville symfony Group Feb 2010


Data Migrations – easy, but...

                                        Also can use:
                                        - preUp()
                                        - preDown()

                                         This will break
                                         eventually, when
                                         you make
                                         changes to the
                                         BrilliantIdea model
                                         (e.g. in 2 months,
                                         you remove the
                                         name field)
Nashville symfony Group Feb 2010


Doctrine Migration – Ruining your day


1) NEVER mix foreign-key changes with table or
column changes                                           Major
     $this->createTable('brilliant_idea',...)           migration
     $this->createForeignKey('brilliant_idea', …)         foul
2) If you care, be careful with your index names
       Name 'product_slug' becomes 'product_slug_idx'
Nashville symfony Group Feb 2010


Tools – MySQLdiff (http://www.mysqldiff.org/)
 • Simple: compares two databases and gives you a list of their
 differences
     – build-all-reload your main database
     – Migrate your test database
Nashville symfony Group Feb 2010


Discussion Notes from the Presentation

 Migration Failures
 Suppose you're migrating from version 2-10 and migration
 #5 fails:
    ●
        Migrations 6-10 will continue to try to run
    ●
        The migration_version table will still be set to 2 after
        the migration, even though versions 3 & 4 were
        successful
Nashville symfony Group Feb 2010


Discussion Notes from the Presentation

 generate-migrations-db
    ●
        In theory, this task compares your db to your models
        and generate migrations based on the difference.
    ●
        After weeks of dev, all migrations could be generated
        at once
    ●
        At least 2 bugs exist in this task:
         ●
           http://pastebin.com/f7e11c784
         ●
           Models prefixed with a lowercase letter will not
           work. But, this does not affect most MACs
Nashville symfony Group Feb 2010


Discussion Notes from the Presentation
 Resetting your migrations
    ●
        To battle “broken” migrations that result from data
        migrations that reference no-longer-used fields, it
        may be a good idea to adopt a strategy of periodically
        “resetting” your migrations:
         ●
           Delete all migration files
         ●
           Run doctrine:generate-migrations-db
         ●
           Manually set your migration_version number to the
           last, newly-generated migration file
Nashville symfony Group Feb 2010


Discussion Notes from the Presentation
 Autoloading Bugs in generate-migrations-diff
    ●
        When using the diff tool, you may get an error such
        as: “Cannot find class PrfxSomeClass”
    ●
        The diff tool generates temporary models and in
        some cases (specifically doctrine model subclassing)
        will require the files in the wrong order
    ●
        There is a hack (try the autoload.yml hack):
         ●
           http://trac.symfony-
           project.org/ticket/7272#comment:13
Nashville symfony Group Feb 2010


Questions? Idea Bubbles?



                   Ryan Weaver
                   @weaverryan
                   iostudio.com
                www.thatsquality.com

More Related Content

PPTX
Theodolite angle measurement
PDF
Area and volume_Surveying, Civil Engineering
PPTX
LAB MANUAL contouring by indirect method . dce: fet: iiui
PDF
Total station
PDF
03 nivellement
DOCX
Mesure des-angles-horizontaux
PPTX
surveying contouring
PDF
Trigonometric Levelling Practical Part
Theodolite angle measurement
Area and volume_Surveying, Civil Engineering
LAB MANUAL contouring by indirect method . dce: fet: iiui
Total station
03 nivellement
Mesure des-angles-horizontaux
surveying contouring
Trigonometric Levelling Practical Part

What's hot (20)

PDF
Cours: Le nivellement
PDF
Mine surveying 981 (1)
PDF
Levelling
PDF
Tacheometry @surveyingreport
PPTX
Openwinding system in mine machinery.pptx
PPTX
Setting out of curve (Survey)
PDF
surveying_module-3-trigonometric-leveling by Denis Jangeed.pdf
PDF
10分でわかる!SAP Concur 経費精算・請求書管理クラウドシステム
PPTX
Simpson_rule_And_Trapezoidal_Rule.pptx
PPTX
Les pieux forés
PDF
The coal mines regulation, 1957
PPTX
Tunnel ventilation ppt tunnel asia 2013
PPTX
Area & Volume
PPTX
SURFACE MINERS
PPTX
Chain surveying and offset
PPTX
Angular measurement
PDF
EDM and Total Stations
PPTX
Total station survey
PPTX
Setting out of works
PPTX
Step by step using a total station
Cours: Le nivellement
Mine surveying 981 (1)
Levelling
Tacheometry @surveyingreport
Openwinding system in mine machinery.pptx
Setting out of curve (Survey)
surveying_module-3-trigonometric-leveling by Denis Jangeed.pdf
10分でわかる!SAP Concur 経費精算・請求書管理クラウドシステム
Simpson_rule_And_Trapezoidal_Rule.pptx
Les pieux forés
The coal mines regulation, 1957
Tunnel ventilation ppt tunnel asia 2013
Area & Volume
SURFACE MINERS
Chain surveying and offset
Angular measurement
EDM and Total Stations
Total station survey
Setting out of works
Step by step using a total station
Ad

Similar to The Art of Doctrine Migrations (20)

PDF
Patterns and Tools for Database Versioning, Migration, Data Loading and Test ...
PPT
Migraine Drupal - syncing your staging and live sites
PDF
Recipes for Drupal distributions
PDF
AdminCamp2019 - Notes V10 Upgrades - Alles was man wissen muss!
PPTX
PHP North-East - Automated Deployment
PPTX
Automated Deployment
PDF
Designing For Occasionally Connected Apps Slideshare
PPTX
ICONUK 2014 Connections Migration Tips and Tricks
PPT
SVN Tool Information : Best Practices
PDF
IBM Notes 10.0.1 FP2 Client Upgrades - made easy!
PDF
BW Migration to HANA Part 2 - SUM DMO Tool for SAP Upgrade & Migration
PDF
Schema migration (DB migration) with Phinx
ODP
Handling Database Deployments
ODP
Svn Basic Tutorial
PPTX
2017 03 25 Microsoft Hacks, How to code efficiently
PDF
RNUG - SUPERCHARGED HCL Notes V11 Upgrades: Turning the WORST Notes deploymen...
PDF
Digital Fabrication Studio v.0.2: Information
PPTX
Git and GitFlow branching model
ODP
Feature Based Web Development with Bazaar
PDF
Drupal Version Control & File System Basics
Patterns and Tools for Database Versioning, Migration, Data Loading and Test ...
Migraine Drupal - syncing your staging and live sites
Recipes for Drupal distributions
AdminCamp2019 - Notes V10 Upgrades - Alles was man wissen muss!
PHP North-East - Automated Deployment
Automated Deployment
Designing For Occasionally Connected Apps Slideshare
ICONUK 2014 Connections Migration Tips and Tricks
SVN Tool Information : Best Practices
IBM Notes 10.0.1 FP2 Client Upgrades - made easy!
BW Migration to HANA Part 2 - SUM DMO Tool for SAP Upgrade & Migration
Schema migration (DB migration) with Phinx
Handling Database Deployments
Svn Basic Tutorial
2017 03 25 Microsoft Hacks, How to code efficiently
RNUG - SUPERCHARGED HCL Notes V11 Upgrades: Turning the WORST Notes deploymen...
Digital Fabrication Studio v.0.2: Information
Git and GitFlow branching model
Feature Based Web Development with Bazaar
Drupal Version Control & File System Basics
Ad

More from Ryan Weaver (20)

PDF
Webpack Encore Symfony Live 2017 San Francisco
PDF
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
PDF
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
PDF
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
PDF
Symfony: Your Next Microframework (SymfonyCon 2015)
PDF
Guard Authentication: Powerful, Beautiful Security
PDF
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
PDF
Twig: Friendly Curly Braces Invade Your Templates!
PDF
Master the New Core of Drupal 8 Now: with Symfony and Silex
PDF
Silex: Microframework y camino fácil de aprender Symfony
PDF
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
PDF
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
PDF
The Wonderful World of Symfony Components
PDF
A PHP Christmas Miracle - 3 Frameworks, 1 app
PDF
Symfony2: Get your project started
PDF
Symony2 A Next Generation PHP Framework
PDF
Hands-on with the Symfony2 Framework
PDF
Being Dangerous with Twig (Symfony Live Paris)
PDF
Being Dangerous with Twig
PDF
Doctrine2 In 10 Minutes
Webpack Encore Symfony Live 2017 San Francisco
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony: Your Next Microframework (SymfonyCon 2015)
Guard Authentication: Powerful, Beautiful Security
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Twig: Friendly Curly Braces Invade Your Templates!
Master the New Core of Drupal 8 Now: with Symfony and Silex
Silex: Microframework y camino fácil de aprender Symfony
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
The Wonderful World of Symfony Components
A PHP Christmas Miracle - 3 Frameworks, 1 app
Symfony2: Get your project started
Symony2 A Next Generation PHP Framework
Hands-on with the Symfony2 Framework
Being Dangerous with Twig (Symfony Live Paris)
Being Dangerous with Twig
Doctrine2 In 10 Minutes

Recently uploaded (20)

PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
Zenith AI: Advanced Artificial Intelligence
PDF
project resource management chapter-09.pdf
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
Web App vs Mobile App What Should You Build First.pdf
PPT
What is a Computer? Input Devices /output devices
PDF
Getting started with AI Agents and Multi-Agent Systems
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PPTX
OMC Textile Division Presentation 2021.pptx
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Developing a website for English-speaking practice to English as a foreign la...
PDF
1 - Historical Antecedents, Social Consideration.pdf
PPTX
observCloud-Native Containerability and monitoring.pptx
PDF
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
PDF
Hindi spoken digit analysis for native and non-native speakers
PDF
Getting Started with Data Integration: FME Form 101
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PDF
A contest of sentiment analysis: k-nearest neighbor versus neural network
PDF
Architecture types and enterprise applications.pdf
PDF
NewMind AI Weekly Chronicles – August ’25 Week III
cloud_computing_Infrastucture_as_cloud_p
Zenith AI: Advanced Artificial Intelligence
project resource management chapter-09.pdf
A comparative study of natural language inference in Swahili using monolingua...
Web App vs Mobile App What Should You Build First.pdf
What is a Computer? Input Devices /output devices
Getting started with AI Agents and Multi-Agent Systems
Assigned Numbers - 2025 - Bluetooth® Document
OMC Textile Division Presentation 2021.pptx
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Developing a website for English-speaking practice to English as a foreign la...
1 - Historical Antecedents, Social Consideration.pdf
observCloud-Native Containerability and monitoring.pptx
Microsoft Solutions Partner Drive Digital Transformation with D365.pdf
Hindi spoken digit analysis for native and non-native speakers
Getting Started with Data Integration: FME Form 101
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
A contest of sentiment analysis: k-nearest neighbor versus neural network
Architecture types and enterprise applications.pdf
NewMind AI Weekly Chronicles – August ’25 Week III

The Art of Doctrine Migrations

  • 1. Nashville symfony Group The Art of Doctrine Migrations Feb 2nd, 2010 Ryan Weaver @weaverryan iostudio.com www.thatsquality.com
  • 2. Nashville symfony Group Feb 2010 So you've updated your code, now to update your database...  PhpMyAdmin: post-it notes, pizza & beer  SQL deltas:  Pros: familiar syntax, tools available  Cons: not systematic, db-specific, disconnected from ORM  Doctrine Migrations:  Pros: systematic, generate automatically, written in Nashville (probably)  Cons: were a pain in the ass (until now), still a bit quirky
  • 3. Nashville symfony Group Feb 2010 A PHP file with simple directions on how to update your database Each file is prefixed by a number, which determines its ordering: /lib/migration/doctrine/  1_add_brilliant_idea_table.php  2_add_good_people_table.php  3_add_desc_field_to_idea.php
  • 4. Nashville symfony Group Feb 2010 Tracking Versions Doctrine keeps track of your db's “version” via migration_version table /lib/migration/doctrine/  1_add_brilliant_idea_table.php version 1  2_add_good_people_table.php version 2  3_add_desc_field_to_idea.php version 3  4_modify_some_column.php version 4  35_alternatively_numbered.php version 5
  • 5. Nashville symfony Group Feb 2010 Take a deep breath and migrate: ./symfony doctrine:migrate [migration #]
  • 6. Nashville symfony Group Feb 2010 Writing Migrations Create a blank migration file: doctrine:generate-migration name  Creates a blank file in lib/migration/doctrine (e.g. 1265085881_add_another_table.php)  Use the rich API to make changes www.doctrine-project.org/Doctrine- Cheat-Sheet-1.1.pdf
  • 7. Nashville symfony Group Feb 2010 Or just generate the migrations automatically...
  • 8. Nashville symfony Group Feb 2010 Generate Migrations For an existing database & project with no migrations: doctrine:generate-migrations-db • Generates migration classes for everything to date • For example, for a project with 75 tables, this would generate 76 migration classes • (1 per table + 1 giant class for all indexes and foreign keys) This gets you “caught up”, but only works once.
  • 9. Nashville symfony Group Feb 2010 Migration-diff tool Generates new migration class(es) based on some schema change 1) Make a change to your schema (e.g. add a column) 2) Run the diff tool task: doctrine:generate-migrations-diff 3) Rebuild your model doctrine:build --all This runs a “diff” between your new schema and your old model files. Lame/Warning: If you rebuild your model before running the diff tool, no changes will be recognized
  • 10. Nashville symfony Group Feb 2010 Filename Conventions Generated migrations take one of these 2 forms: 263866565_migration_name.php 263866565_version15.php We recommend renaming to include the version #: version1_migration_name.php 263866565_version15.php
  • 11. Nashville symfony Group Feb 2010 Model Name Conventions Generated migrations take one of these 2 forms: class Version15 class MigrationName We recommend naming the class by the version #: class Version 15
  • 12. Nashville symfony Group Feb 2010 Data Migrations – easy, but... Also can use: - preUp() - preDown() This will break eventually, when you make changes to the BrilliantIdea model (e.g. in 2 months, you remove the name field)
  • 13. Nashville symfony Group Feb 2010 Doctrine Migration – Ruining your day 1) NEVER mix foreign-key changes with table or column changes Major $this->createTable('brilliant_idea',...) migration $this->createForeignKey('brilliant_idea', …) foul 2) If you care, be careful with your index names Name 'product_slug' becomes 'product_slug_idx'
  • 14. Nashville symfony Group Feb 2010 Tools – MySQLdiff (http://www.mysqldiff.org/) • Simple: compares two databases and gives you a list of their differences – build-all-reload your main database – Migrate your test database
  • 15. Nashville symfony Group Feb 2010 Discussion Notes from the Presentation Migration Failures Suppose you're migrating from version 2-10 and migration #5 fails: ● Migrations 6-10 will continue to try to run ● The migration_version table will still be set to 2 after the migration, even though versions 3 & 4 were successful
  • 16. Nashville symfony Group Feb 2010 Discussion Notes from the Presentation generate-migrations-db ● In theory, this task compares your db to your models and generate migrations based on the difference. ● After weeks of dev, all migrations could be generated at once ● At least 2 bugs exist in this task: ● http://pastebin.com/f7e11c784 ● Models prefixed with a lowercase letter will not work. But, this does not affect most MACs
  • 17. Nashville symfony Group Feb 2010 Discussion Notes from the Presentation Resetting your migrations ● To battle “broken” migrations that result from data migrations that reference no-longer-used fields, it may be a good idea to adopt a strategy of periodically “resetting” your migrations: ● Delete all migration files ● Run doctrine:generate-migrations-db ● Manually set your migration_version number to the last, newly-generated migration file
  • 18. Nashville symfony Group Feb 2010 Discussion Notes from the Presentation Autoloading Bugs in generate-migrations-diff ● When using the diff tool, you may get an error such as: “Cannot find class PrfxSomeClass” ● The diff tool generates temporary models and in some cases (specifically doctrine model subclassing) will require the files in the wrong order ● There is a hack (try the autoload.yml hack): ● http://trac.symfony- project.org/ticket/7272#comment:13
  • 19. Nashville symfony Group Feb 2010 Questions? Idea Bubbles? Ryan Weaver @weaverryan iostudio.com www.thatsquality.com