2010-03-05 なんかかなり久しぶりだよなぁっと
djangoで複数DBを扱う
django1.2 から (?) 複数のDBを扱えるようになったぽいので試してみた。
詳しくは、http://docs.djangoproject.com/en/dev/topics/db/multi-db/ 参照
まずは最新のソースをインストールする
適当なディレクトリでレポジトリからソースを取得してきてインストール。
$ svn co http://code.djangoproject.com/svn/django/trunk/ $ sudo python trunk/setup.py install $ django-admin.py --version 1.2 beta 1
プロジェクトの作成
特にネタが無いので、一画面だけの掲示板を作る事にする。
$ django-admin.py startproject django_bollutinboard $ ls django_bollutinboard
できた。
アプリケーションの作成
$ cd django_bollutinboard $ python manage.py startapp bollutinboard $ ls django_bollutinboard
settings.pyを編集
アプリケーションの追加やテンプレートディレクトリの追加は適当に。
なんかミドルウェアに、'django.middleware.csrf.CsrfViewMiddleware' が最初から入っていたり、
'django.contrib.messages' とかいうモジュールが増えている(知らなかっただけ?)けど今回はスルー。
さて、DB情報の設定部分、どのようになっているのでしょうか。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
おっ、ディレクトリ形式になっています。これに default に習って情報を追加していけばいいっぽい。
なのでこんな風に編集。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'default.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
},
'second': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'second.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
bollutinboardの中の views.py, models.py, forms.py を編集
ちゃちゃっとやる。
views.py
#-*- coding: utf-8 -*- from django.conf import settings from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render_to_response from django.contrib.auth.decorators import login_required from bollutinboard.models import BollutinboardModel from bollutinboard.forms import AddBollutinboardForm def index(req): """ """ if req.method == 'POST': form = AddBollutinboardForm(req.POST) if form.is_valid(): form.save() else: form = AddBollutinboardForm() messages = BollutinboardModel.objects.using('second').all() form = AddBollutinboardForm() return render_to_response('index.html',{ 'form':form, 'messages':messages, })
BollutinboardModelモデルから情報を取得するところをご注目。
usingメソッドが呼び出されており、'second'が引数で指定されています。
この'second'は、settings.pyで指定したDB情報の内の一つで、指定したDBから情報を
取ってきています。
models.py
#-*- coding: utf-8 -*- from django.db import models class BollutinboardModel(models.Model): """ """ body = models.TextField(max_length=1000) cdate = models.DateTimeField(auto_now_add=True) udate = models.DateTimeField(auto_now=True) def __unicode__(self): """ """ return self.body
モデルはいままでと変わらず。
forms.py
#-*- coding: utf-8 -*- from django import forms from bollutinboard.models import BollutinboardModel class AddBollutinboardForm(forms.Form): """ """ body = forms.CharField(max_length=1000, widget=forms.Textarea) def save(self): """ """ body = self.cleaned_data['body'] BollutinboardModel(body=body).save(using='default') BollutinboardModel(body=body).save(using='second')
forms.pyのAddBollutinboardFormクラスのsaveメソッドをご注目。
2つのBollutinboardModelモデルのsaveメソッド呼び出しがあります。
しかも、引数でusing='default'、using='second'を指定しています。
これにより、2つのうちどちらのDBを使用するか指定できるようになっているみたいです。
では次に肝心のDBを作成してみます。
DBの作成
default のDBを作成
今までとおなじ
$ python manage.py syncdb
second のDBを作成
以下のようなコマンドになります。
$ ./manage.py syncdb --database=second
これで二つのDB「default.db」と「second.db」が作られます。
アプリの起動
あとは実際に動かしてみてください。
$ python manage.py runserver
- 9 http://pipes.yahoo.com/pipes/pipe.info?_id=5c957097ed152660234169b605fb3fa7
- 4 http://www.google.co.jp/reader/view/
- 3 http://pipes.yahoo.com/pipes/pipe.info?_id=02db597254ec68550537866a2fca2ce6
- 3 http://reader.livedoor.com/reader/
- 2 http://bit.ly/aiOrAo
- 2 http://longurl.org
- 2 http://www.google.co.jp/reader/i/?source=mog&gl=jp
- 2 http://www.google.com/reader/view/
- 1 http://antenna.larme.dnsalias.net/
- 1 http://d.hatena.ne.jp/johzan/

