Hatena::ブログ(Diary)

Ponsukeのプログラミング日記 このページをアンテナに追加 RSSフィード Twitter

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Ponsuke/20100305/1267797617