Django South Миграция баз данных Николай Ходов [email_address]
С чем его подают? <ul><li>Изменения структуры базы данных </li></ul><ul><li>Добавление и удаление столбцов </li></ul><ul><...
Pros & Cons <ul><li>Заводится с полуоборота из коробки </li></ul><ul><li>Совместим с большинством моделей  </li></ul><ul><...
Как начать? <ul><li>Прописать  в INSTALLED_APPS в settings.py: </li></ul><ul><li>INSTALLED_APPS = ( </li></ul><ul><li>… </...
Переходим к делу сlass Comment До После Поле Тип timestamp DateTimeField headers BaseDictField who ForeignKey text CharFie...
BaseDictField <ul><li>src/home/fields.py: </li></ul><ul><li>from  django.db  import  models </li></ul><ul><li># Словарь, к...
Первая миграция <ul><li>~/disqus/src/$   ./manage.py schemamigration home  --initial </li></ul>! Cannot freeze field 'home...
Первая миграция <ul><li>src/home/models.py: </li></ul><ul><li># Импортируем функцию добавления правил интроспекции </li></...
Вторая миграция <ul><li>~/disqus/src/$  ./manage.py schemamigration home --auto  </li></ul>src/home/models.py: class  Comm...
Третья миграция <ul><li>~/disqus/src$  ./manage.py datamigration home headers_to_ip_ua </li></ul>Created 0003_headers_to_i...
Меняем на сервере <ul><li>Т.к. на сервере уже есть база данных, то надо сделать “фейковую” миграцию, которая ничего не изм...
Разворачиваем с нуля <ul><li>Стандарная синхронизация средствами Django: </li></ul><ul><li>$  ./manage.py syncdb </li></ul...
Вопросы? Cпасибо за внимание? Презентация http://bit.ly/django-meetup-1203-south Исходники  https://github.com/nikolaykhod...
Upcoming SlideShare
Loading in …5
×

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

5,716 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,716
On SlideShare
0
From Embeds
0
Number of Embeds
74
Actions
Shares
0
Downloads
23
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. Django South Миграция баз данных Николай Ходов [email_address]
  2. 2. С чем его подают? <ul><li>Изменения структуры базы данных </li></ul><ul><li>Добавление и удаление столбцов </li></ul><ul><li>Изменение типа столбца </li></ul><ul><li>Реорганизация данных под новую структуру </li></ul>
  3. 3. Pros & Cons <ul><li>Заводится с полуоборота из коробки </li></ul><ul><li>Совместим с большинством моделей </li></ul><ul><li>Неимоверно простая </li></ul><ul><li>и логичная концепция </li></ul><ul><li>В особых случаях требуется ручное вмешательство :(, но редко, к счастью :) </li></ul>
  4. 4. Как начать? <ul><li>Прописать в INSTALLED_APPS в settings.py: </li></ul><ul><li>INSTALLED_APPS = ( </li></ul><ul><li>… </li></ul><ul><li>'south', </li></ul><ul><li>) </li></ul><ul><li>Установить </li></ul><ul><ul><li>Через PIP: </li></ul></ul><ul><ul><ul><li>$ sudo pip install south </li></ul></ul></ul><ul><ul><li>Из исходников: </li></ul></ul><ul><ul><ul><li>$ hg clone http://bitbucket.org/andrewgodwin/south/ </li></ul></ul></ul><ul><ul><ul><li>$ sudo python setup.py install </li></ul></ul></ul>
  5. 5. Переходим к делу сlass Comment До После Поле Тип timestamp DateTimeField headers BaseDictField who ForeignKey text CharField Поле Тип timestamp DateTimeField ip CharField user_agent CharField who ForeignKey text CharField
  6. 6. BaseDictField <ul><li>src/home/fields.py: </li></ul><ul><li>from django.db import models </li></ul><ul><li># Словарь, к элементам которого можно получать доступ </li></ul><ul><li># как к полям объекта </li></ul><ul><li>class BaseDict( dict ): </li></ul><ul><li>… </li></ul><ul><li># Поле для хранения JSON-объекта. </li></ul><ul><li># В run-time значение поля имеет тип BaseDict </li></ul><ul><li>class BaseDictField(models.TextField): </li></ul><ul><li>… . </li></ul>
  7. 7. Первая миграция <ul><li>~/disqus/src/$ ./manage.py schemamigration home --initial </li></ul>! 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 <ul><li>Ээээ, что это такое? </li></ul><ul><li>Custom field не известен South </li></ul><ul><li>Надо ему помочь </li></ul>
  8. 8. Первая миграция <ul><li>src/home/models.py: </li></ul><ul><li># Импортируем функцию добавления правил интроспекции </li></ul><ul><li>from south.modelsinspector import add_introspection_rules </li></ul><ul><li>... </li></ul><ul><li>class Comment(models.Model): </li></ul><ul><li>… </li></ul><ul><li># Добавляем правило интроспекции </li></ul><ul><li>add_introspection_rules([], [ &quot;^home.fields.BaseDictField&quot; ]) </li></ul>
  9. 9. Вторая миграция <ul><li>~/disqus/src/$ ./manage.py schemamigration home --auto </li></ul>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. 10. Третья миграция <ul><li>~/disqus/src$ ./manage.py datamigration home headers_to_ip_ua </li></ul>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(&quot;Cannot reverse this migration.&quot;)
  11. 11. Меняем на сервере <ul><li>Т.к. на сервере уже есть база данных, то надо сделать “фейковую” миграцию, которая ничего не изменяет: </li></ul><ul><li>$ ./manage.py migrate home 0001 --fake </li></ul><ul><li>Затем применить остальные миграции (0002 и далее): </li></ul><ul><li>$ ./manage.py migrate home </li></ul>
  12. 12. Разворачиваем с нуля <ul><li>Стандарная синхронизация средствами Django: </li></ul><ul><li>$ ./manage.py syncdb </li></ul><ul><li>Затем последовательно синхронизируем приложения, где есть миграции South: </li></ul><ul><li>$ ./manage.py migrate home </li></ul>
  13. 13. Вопросы? Cпасибо за внимание? Презентация http://bit.ly/django-meetup-1203-south Исходники https://github.com/nikolaykhodov/django-meetup-1203-south

×