修行中
models.py 修正して syncdb したらええのか、と思ってたら反映されず。一旦吸い上げて syncdb した後に云々。って rails みたく migration なソレは無いのか。
と言いつつ google 先生にお伺いをタテてみましたらざっくり二点なソレ
とりあえず django 本体に取り込まれるまでは script で何とかした方が良さげ。下側のスクリプトで試験してみた。修正したテーブルにはデータが無いのでアレですが、問題は無い模様。
ただ、列を削除した場合に微妙になりそげなカンジはするな (根拠ゼロ)。
これ、ダミーなプロジェクト作って色々試してみたら良いかも、というコトでヤッてみる事に。
試験
何も考えず手を動かしてみる。
$ django-admin.py startproject dbpickletest $ cd dbpickletest $ ls __init__.py manage.py settings.py urls.py $
で、適当に settings.py を修正
$ diff settings.py settings.py~ 12,13c12,13 < DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. < DATABASE_NAME = 'test.db' # Or path to database file if using sqlite3. --- > DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. > DATABASE_NAME = '' # Or path to database file if using sqlite3. 24,25c24 < #TIME_ZONE = 'America/Chicago' < TIME_ZONE = 'Asia/Tokyo' --- > TIME_ZONE = 'America/Chicago' 29,30c28 < #LANGUAGE_CODE = 'en-us' < LANGUAGE_CODE = 'ja' --- > LANGUAGE_CODE = 'en-us' 78d75 < 'django.contrib.admin', 83d79 < 'dbpickletest', $
で、models.py は例えばこんな感じ。
from django.db import models class Vlan(models.Model): vlan_no = models.CharField(max_length = 30, unique = True, blank = False) network_address = models.IPAddressField() subnet_mask = models.IPAddressField() def __unicode__(self): return u'%s' % (self.vlan_no) class Admin: list_display = ('vlan_no', 'network_address', 'subnet_mask', ) pass
で、syncdb してみる。
$ python manage.py syncdb Creating table django_admin_log Creating table auth_message Creating table auth_group Creating table auth_user Creating table auth_permission Creating table django_content_type Creating table django_session Creating table django_site Creating table dbpickletest_vlan You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (Leave blank to use 'guest'): admin E-mail address: admin@xxx.com Password: Password (again): Superuser created successfully. Installing index for admin.LogEntry model Installing index for auth.Message model Installing index for auth.Permission model $
ええと、runserver してみるか。
$ python manage.py runserver (ry
localhost:8000/admin/ にアクセスできぬ、と思ったら urls.py 修正してなかった。どうもイケマセン。修正後、リトライ。
$ python manage.py runserver Validating models... 0 errors found Django version 0.97-pre-SVN-7520, using settings 'dbpickletest.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
とりあえずダミー的なナニを一件追加。これで列を削除してみれば良いのか。とゆーコトで以下のようにアドレスな列を削除。
from django.db import models class Vlan(models.Model): vlan_no = models.CharField(max_length = 30, unique = True, blank = False) # network_address = models.IPAddressField() # subnet_mask = models.IPAddressField() def __unicode__(self): return u'%s' % (self.vlan_no) class Admin: list_display = ('vlan_no', # 'network_address', # 'subnet_mask', ) pass
で、dbpickle.py の登場ですな。あ、違うや。まず修正前に dump するのか。
$ PYTHONPATH=/home/guest/dbpickletest DJANGO_SETTINGS_MODULE=settings ../dbpickle.py --dump --file=test.pickle INFO dumping sessions.session Session object INFO dumping admin.logentry LogEntry object INFO dumping sites.site example.com INFO dumping auth.user admin INFO dumping auth.user.groups x 0 INFO dumping auth.user.user_permissions x 0 INFO dumping auth.permission contenttypes | content type | Can add content type INFO dumping auth.permission contenttypes | content type | Can change content type INFO dumping auth.permission contenttypes | content type | Can delete content type INFO dumping auth.permission auth | group | Can add group INFO dumping auth.permission auth | group | Can change group INFO dumping auth.permission auth | group | Can delete group INFO dumping auth.permission admin | log entry | Can add log entry INFO dumping auth.permission admin | log entry | Can change log entry INFO dumping auth.permission admin | log entry | Can delete log entry INFO dumping auth.permission auth | message | Can add message INFO dumping auth.permission auth | message | Can change message INFO dumping auth.permission auth | message | Can delete message INFO dumping auth.permission auth | permission | Can add permission INFO dumping auth.permission auth | permission | Can change permission INFO dumping auth.permission auth | permission | Can delete permission INFO dumping auth.permission sessions | session | Can add session INFO dumping auth.permission sessions | session | Can change session INFO dumping auth.permission sessions | session | Can delete session INFO dumping auth.permission sites | site | Can add site INFO dumping auth.permission sites | site | Can change site INFO dumping auth.permission sites | site | Can delete site INFO dumping auth.permission auth | user | Can add user INFO dumping auth.permission auth | user | Can change user INFO dumping auth.permission auth | user | Can delete user INFO dumping auth.permission dbpickletest | vlan | Can add vlan INFO dumping auth.permission dbpickletest | vlan | Can change vlan INFO dumping auth.permission dbpickletest | vlan | Can delete vlan INFO dumping dbpickletest.vlan 1024 INFO dumping contenttypes.contenttype content type INFO dumping contenttypes.contenttype group INFO dumping contenttypes.contenttype log entry INFO dumping contenttypes.contenttype message INFO dumping contenttypes.contenttype permission INFO dumping contenttypes.contenttype session INFO dumping contenttypes.contenttype site INFO dumping contenttypes.contenttype user INFO dumping contenttypes.contenttype vlan $
で、データベースを削除して models.py を修正して sync して load
$ mv test.db test.db.OLD $ python manage.py syncdb Creating table django_admin_log Creating table auth_message Creating table auth_group Creating table auth_user Creating table auth_permission Creating table django_content_type Creating table django_session Creating table django_site Creating table dbpickletest_vlan You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): no Installing index for admin.LogEntry model Installing index for auth.Message model Installing index for auth.Permission model $ sqlite3 test.db sqlite> .tables auth_group auth_user_user_permissions auth_group_permissions dbpickletest_vlan auth_message django_admin_log auth_permission django_content_type auth_user django_session auth_user_groups django_site sqlite> .schema dbpickletest_vlan CREATE TABLE "dbpickletest_vlan" ( "id" integer NOT NULL PRIMARY KEY, "vlan_no" varchar(30) NOT NULL UNIQUE ); sqlite> $ $ PYTHONPATH=/home/guest/dbpickletest DJANGO_SETTINGS_MODULE=settings ../dbpickle.py --load --file=test.pickle INFO loading contenttypes.contenttype 5 INFO loading auth.permission 13 INFO loading contenttypes.contenttype 8 INFO loading auth.permission 24 INFO loading dbpickletest.vlan 1 INFO loading auth.permission 14 INFO loading contenttypes.contenttype 1 INFO loading contenttypes.contenttype 9 INFO loading auth.permission 25 INFO loading auth.permission 15 INFO loading sites.site 1 INFO loading auth.permission 26 INFO loading contenttypes.contenttype 3 INFO loading auth.permission 8 INFO loading sessions.session bf610c104bdfaacabc3a805a2607bf7b INFO loading auth.permission 27 INFO loading auth.permission 9 INFO loading auth.user 1 INFO loading admin.logentry 1 INFO loading contenttypes.contenttype 2 INFO loading contenttypes.contenttype 4 INFO loading auth.permission 10 INFO loading auth.permission 11 INFO loading contenttypes.contenttype 7 INFO loading auth.permission 20 INFO loading auth.permission 21 INFO loading contenttypes.contenttype 6 INFO loading auth.permission 22 INFO loading auth.permission 4 INFO loading auth.permission 23 INFO loading auth.permission 5 INFO loading auth.permission 16 INFO loading auth.permission 6 INFO loading auth.permission 17 INFO loading auth.permission 7 INFO loading auth.permission 18 INFO loading auth.permission 19 INFO loading auth.permission 1 INFO loading auth.permission 2 INFO loading auth.permission 3 INFO loading auth.permission 12 $
うを。通りよった。
$ sqlite3 test.db SQLite version 3.3.8 Enter ".help" for instructions sqlite> .tables auth_group auth_user_user_permissions auth_group_permissions dbpickletest_vlan auth_message django_admin_log auth_permission django_content_type auth_user django_session auth_user_groups django_site sqlite> select * from dbpickletest_vlan; 1|1024 sqlite>
これはこれは。でも列追加して、な時にどうなるか微妙だなぁ。もう少し確認。とりあえずデータを一件追加しといて models.py を以下に修正
from django.db import models class Vlan(models.Model): vlan_no = models.CharField(max_length = 30, unique = True, blank = False) dummy = models.CharField(max_length = 30, unique = True, blank = False) # network_address = models.IPAddressField() # subnet_mask = models.IPAddressField() def __unicode__(self): return u'%s' % (self.vlan_no) class Admin: list_display = ('vlan_no', # 'network_address', # 'subnet_mask', ) pass
とりあえず保存する前に保存
$ PYTHONPATH=/home/guest/dbpickletest DJANGO_SETTINGS_MODULE=settings ../dbpickle.py --dump --file=test.pickle (snip $
で、上記の修正を保存して DB 削除して syncdb 実行
$ mv test.db test.db.OLD $ python manage.py syncdb Creating table django_admin_log Creating table auth_message Creating table auth_group Creating table auth_user Creating table auth_permission Creating table django_content_type Creating table django_session Creating table django_site Creating table dbpickletest_vlan You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): no Installing index for admin.LogEntry model Installing index for auth.Message model Installing index for auth.Permission model $
で、戻し。
$ PYTHONPATH=/home/guest/dbpickletest DJANGO_SETTINGS_MODULE=settings ../dbpickle.py --load --file=test.pickle (snip
特に不具合が報告されているワケではなし。sqlite3 で接続
$ sqlite3 test.db SQLite version 3.3.8 sqlite> .tables auth_group auth_user_user_permissions auth_group_permissions dbpickletest_vlan auth_message django_admin_log auth_permission django_content_type auth_user django_session auth_user_groups django_site sqlite> .schema dbpickletest_vlan CREATE TABLE "dbpickletest_vlan" ( "id" integer NOT NULL PRIMARY KEY, "vlan_no" varchar(30) NOT NULL UNIQUE, "dummy" varchar(30) NOT NULL UNIQUE ); sqlite> select * from dbpickletest_vlan ; sqlite>
げげ。データが無ひ。これは件のソースを見て何をしてるのか確認した方が良さげ。