Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

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

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio

Eche un vistazo a continuación

1 de 13 Anuncio

Más Contenido Relacionado

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

Anuncio

Más reciente (20)

Anuncio

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

×