Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

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

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Hier ansehen

1 von 13 Anzeige

Weitere Verwandte Inhalte

Ähnlich wie Django South. Миграция баз данных. (20)

Anzeige

Aktuellste (20)

Anzeige

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;^homefieldsBaseDictField&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

×