修行中

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>

げげ。データが無ひ。これは件のソースを見て何をしてるのか確認した方が良さげ。