SlideShare a Scribd company logo
Django South Миграция баз данных Николай Ходов [email_address]
С чем его подают? Изменения структуры базы данных Добавление и удаление столбцов Изменение типа столбца Реорганизация данных под новую структуру
Pros & Cons Заводится с полуоборота из коробки Совместим с большинством моделей  Неимоверно простая  и логичная концепция В особых случаях  требуется ручное вмешательство :(, но редко, к счастью :)
Как начать? Прописать  в INSTALLED_APPS в settings.py: INSTALLED_APPS = ( … 'south', ) Установить Через PIP: $ sudo pip install south Из исходников: $ hg clone http://bitbucket.org/andrewgodwin/south/ $ sudo python setup.py install
Переходим к делу сlass Comment До После Поле Тип timestamp DateTimeField headers BaseDictField who ForeignKey text CharField Поле Тип timestamp DateTimeField ip CharField user_agent CharField who ForeignKey text CharField
BaseDictField src/home/fields.py: from  django.db  import  models # Словарь, к элементам которого можно получать доступ  # как к полям объекта class  BaseDict( dict ): … # Поле для хранения JSON-объекта. # В run-time значение поля имеет тип BaseDict class  BaseDictField(models.TextField): … .
Первая миграция ~/disqus/src/$   ./manage.py schemamigration home  --initial ! Cannot freeze field 'home.comment.headers' ! (this field has class home.fields.BaseDictField) ! South cannot introspect some fields; this is probably because they are custom ! fields. If they worked in 0.6 or below, this is because we have removed the ! models parser (it often broke things). ! To fix this, read http://south.aeracode.org/wiki/MyFieldsDontWork Ээээ, что это такое? Custom field не известен South Надо ему помочь
Первая миграция src/home/models.py: # Импортируем функцию добавления правил интроспекции from  south.modelsinspector  import  add_introspection_rules ... class  Comment(models.Model): … # Добавляем правило интроспекции add_introspection_rules([], [ "^home\.fields\.BaseDictField" ])
Вторая миграция ~/disqus/src/$  ./manage.py schemamigration home --auto  src/home/models.py: class  Comment(models.Model): … ip = models.CharField(max_length= 32 ,  blank= True ) user_agent = models.CharField(max_length= 256 ,  blank= True ) + Added field ip on home.Comment + Added field user_agent on home.Comment Created 0002_auto__add_field_comment_ip__add_field_comment_user_agent.py. You can now apply this migration with: ./manage.py migrate home
Третья миграция ~/disqus/src$  ./manage.py datamigration home headers_to_ip_ua Created 0003_headers_to_ip_ua.py. ./src/home/migrations/0003_headers_to_ip_ua.py: class  Migration(DataMigration): def  forwards( self , orm): for  comment  in  orm[ 'home.Comment' ].objects.all(): comment.ip = comment.headers.REMOTE_ADDR comment.user_agent = comment.headers.HTTP_USER_AGENT comment.save() def  backwards( self , orm): # При попытке откатить возникнет исключение raise  RuntimeError("Cannot reverse this migration.")
Меняем на сервере Т.к. на сервере уже есть база данных, то надо сделать “фейковую” миграцию, которая ничего не изменяет: $  ./manage.py migrate home 0001 --fake Затем применить остальные миграции (0002 и далее): $  ./manage.py migrate home
Разворачиваем с нуля Стандарная синхронизация средствами Django: $  ./manage.py syncdb Затем последовательно синхронизируем приложения, где есть миграции South: $  ./manage.py migrate home
Вопросы? Cпасибо за внимание? Презентация http://bit.ly/django-meetup-1203-south Исходники  https://github.com/nikolaykhodov/django-meetup-1203-south

More Related Content

PPT
Модульное тестирование iOS-приложений.
PDF
Cобачники против кинофобов
PDF
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
PDF
Изоморфные приложения и Python - Виталий Глибин, Huntflow
ODP
ZFConf 2010: Zend Framework and Doctrine
PPT
1f5694b92ab2c96e2038b33a8b0ceb7d
PDF
Миша Рудрастых: Введение в HTTP API WordPress
PPTX
Go Template Toolkit, Сергей Свистунов, Lazada
Модульное тестирование iOS-приложений.
Cобачники против кинофобов
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
Изоморфные приложения и Python - Виталий Глибин, Huntflow
ZFConf 2010: Zend Framework and Doctrine
1f5694b92ab2c96e2038b33a8b0ceb7d
Миша Рудрастых: Введение в HTTP API WordPress
Go Template Toolkit, Сергей Свистунов, Lazada

What's hot (8)

PPTX
I tmozg js_school_jquery
PDF
Страх и ненависть в исходном коде
ODP
Saint Perl 2009: CGI::Ajax demo
PDF
Erlang tasty & useful stuff
PDF
Easy selenium test automation on python
PPT
лабораторная работа №9
PDF
10 - Web-технологии. MVC фреймворки (продолжение)
PPT
Ubercart -nemnogo_primerov_iz_zhizni
I tmozg js_school_jquery
Страх и ненависть в исходном коде
Saint Perl 2009: CGI::Ajax demo
Erlang tasty & useful stuff
Easy selenium test automation on python
лабораторная работа №9
10 - Web-технологии. MVC фреймворки (продолжение)
Ubercart -nemnogo_primerov_iz_zhizni
Ad

Similar to Django South. Миграция баз данных. (20)

PDF
Zend Framework и Doctrine
PDF
Как мы делаем модули PHP в Badoo – Антон Довгаль
PPTX
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
PDF
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
PPT
Введение в Django
PDF
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
PDF
Разработка через тестирование в Python и Django #pyconru
PDF
Pycon Russia 2013 - Разработка через тестирование в Python и Django
PPTX
Aspect Oriented Programming and Design Patterns
PPTX
AOP and Design Patterns (GoF)
PPTX
Problems of Automated Generation of Exploits on the Basis of Source Code
PDF
SECON'2016. Приходько Артём, Модульное JavaScript приложение
PPT
Rich UI on Dojo Toolkit and Zend Framework
PPT
Декораторы в Python и их практическое использование
PPTX
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
PPTX
Web осень 2013 лекция 8
PPTX
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
PDF
WordCamp Russia 2015: Фильтры и события в WordPress.
PPT
бегун
PPT
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
Zend Framework и Doctrine
Как мы делаем модули PHP в Badoo – Антон Довгаль
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Введение в Django
Илья Шаляпин, Евгений Генералов: Разработка через тестирование в Python и Djn...
Разработка через тестирование в Python и Django #pyconru
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Aspect Oriented Programming and Design Patterns
AOP and Design Patterns (GoF)
Problems of Automated Generation of Exploits on the Basis of Source Code
SECON'2016. Приходько Артём, Модульное JavaScript приложение
Rich UI on Dojo Toolkit and Zend Framework
Декораторы в Python и их практическое использование
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
Web осень 2013 лекция 8
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
WordCamp Russia 2015: Фильтры и события в WordPress.
бегун
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
Ad

More from MoscowDjango (11)

PDF
Тестирование и Django
PDF
Пример fuzzy testing для поиска URL в тексте
PDF
TDD или как я стараюсь писать код
PPTX
Cyclone + Eventsource (realtime push-сообщения)
PPT
Производительность в Django
PDF
Django на Android
PDF
Работа со статикой в Django
PPTX
Разработка расширяемых приложений на Django
PPTX
Class Based Generic Views в Django
PPTX
Простой и удобный деплоймент проекта
PDF
Журнальная вёрстка в Django
Тестирование и Django
Пример fuzzy testing для поиска URL в тексте
TDD или как я стараюсь писать код
Cyclone + Eventsource (realtime push-сообщения)
Производительность в Django
Django на Android
Работа со статикой в Django
Разработка расширяемых приложений на Django
Class Based Generic Views в Django
Простой и удобный деплоймент проекта
Журнальная вёрстка в Django

Django South. Миграция баз данных.

  • 1. Django South Миграция баз данных Николай Ходов [email_address]
  • 2. С чем его подают? Изменения структуры базы данных Добавление и удаление столбцов Изменение типа столбца Реорганизация данных под новую структуру
  • 3. Pros & Cons Заводится с полуоборота из коробки Совместим с большинством моделей Неимоверно простая и логичная концепция В особых случаях требуется ручное вмешательство :(, но редко, к счастью :)
  • 4. Как начать? Прописать в INSTALLED_APPS в settings.py: INSTALLED_APPS = ( … 'south', ) Установить Через PIP: $ sudo pip install south Из исходников: $ hg clone http://bitbucket.org/andrewgodwin/south/ $ sudo python setup.py install
  • 5. Переходим к делу сlass Comment До После Поле Тип timestamp DateTimeField headers BaseDictField who ForeignKey text CharField Поле Тип timestamp DateTimeField ip CharField user_agent CharField who ForeignKey text CharField
  • 6. BaseDictField src/home/fields.py: from django.db import models # Словарь, к элементам которого можно получать доступ # как к полям объекта class BaseDict( dict ): … # Поле для хранения JSON-объекта. # В run-time значение поля имеет тип BaseDict class BaseDictField(models.TextField): … .
  • 7. Первая миграция ~/disqus/src/$ ./manage.py schemamigration home --initial ! Cannot freeze field 'home.comment.headers' ! (this field has class home.fields.BaseDictField) ! South cannot introspect some fields; this is probably because they are custom ! fields. If they worked in 0.6 or below, this is because we have removed the ! models parser (it often broke things). ! To fix this, read http://south.aeracode.org/wiki/MyFieldsDontWork Ээээ, что это такое? Custom field не известен South Надо ему помочь
  • 8. Первая миграция src/home/models.py: # Импортируем функцию добавления правил интроспекции from south.modelsinspector import add_introspection_rules ... class Comment(models.Model): … # Добавляем правило интроспекции add_introspection_rules([], [ "^home\.fields\.BaseDictField" ])
  • 9. Вторая миграция ~/disqus/src/$ ./manage.py schemamigration home --auto src/home/models.py: class Comment(models.Model): … ip = models.CharField(max_length= 32 , blank= True ) user_agent = models.CharField(max_length= 256 , blank= True ) + Added field ip on home.Comment + Added field user_agent on home.Comment Created 0002_auto__add_field_comment_ip__add_field_comment_user_agent.py. You can now apply this migration with: ./manage.py migrate home
  • 10. Третья миграция ~/disqus/src$ ./manage.py datamigration home headers_to_ip_ua Created 0003_headers_to_ip_ua.py. ./src/home/migrations/0003_headers_to_ip_ua.py: class Migration(DataMigration): def forwards( self , orm): for comment in orm[ 'home.Comment' ].objects.all(): comment.ip = comment.headers.REMOTE_ADDR comment.user_agent = comment.headers.HTTP_USER_AGENT comment.save() def backwards( self , orm): # При попытке откатить возникнет исключение raise RuntimeError("Cannot reverse this migration.")
  • 11. Меняем на сервере Т.к. на сервере уже есть база данных, то надо сделать “фейковую” миграцию, которая ничего не изменяет: $ ./manage.py migrate home 0001 --fake Затем применить остальные миграции (0002 и далее): $ ./manage.py migrate home
  • 12. Разворачиваем с нуля Стандарная синхронизация средствами Django: $ ./manage.py syncdb Затем последовательно синхронизируем приложения, где есть миграции South: $ ./manage.py migrate home
  • 13. Вопросы? Cпасибо за внимание? Презентация http://bit.ly/django-meetup-1203-south Исходники https://github.com/nikolaykhodov/django-meetup-1203-south