読者です 読者をやめる 読者になる 読者になる

[django][trironn] Ubuntu上でTritonnインストールしDjangoから使用できるか試す2

2008/05/25からの続き
本日はDjango上からtritonn上のSQLを呼び出すための、アプリを作成する。

作成中

テストアプリケーションの作成

アプリ作成
$ django-admin.py startproject mysite
$ python manage.py startapp polls
$ vi polls/models.py
-----
from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
-----
DB作成
$ mysql -u root
> create database hoge;
> quit;
vi /RROJECT_ROOT/settings.py
-----
   :
   :
DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'hoge'             # Or path to database file if using sqlite3.
DATABASE_USER = 'root'             # Not used with s
   :
   :
TEMPLATE_DIRS = (
    'polls/template'
)
   :
   :
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'mysite.polls'
)
-----

Tritonn用のSQL設定

アプリケーション名/sql の下に、モデル名(小文字).sqlで保存しておくと、CREATE TABLEした後にテーブルを自動で実行してくれるらしい。
ここを参照

$ cd /ROOT/polls
$ mkdir sql
$ cd sql
$ vi poll.sql
-----
alter table poll add fulltext using ngram(question);
-----
初期テーブル作成
$ cd /ROOT/polls
$ python manage.py syncdb
初期データ作成
$ mysql -u root hoge
> insert into poll (id, question, pub_date) values (1, '明日は晴れか?', now());
> insert into poll (id, question, pub_date) values (2, '今日は雨か?', now());

fulltextがちゃんと作成されているか確認

$ mysql -u root hoge
>  show index from poll;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| poll  |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         | 
| poll  |          1 | question |            1 | question    | NULL      |        NULL |     NULL | NULL   |      | FULLTEXT   |         | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+----
template作成
$ mkdir /ROOT/mysite/polls/template/polls
$ cd /ROOT/mysite/polls/template/polls
$ vi index.html
-----
{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li>{{ poll.question }}</li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
-----
$ cp index.html toritonn.html
$ vi toritonn.html
-----
TritoNNNNNNNNNNNNNNNNNN

あとはindex.html
-----
view作成
$ vi /ROOT/mysite/urls.py
-----
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^polls/$', 'mysite.polls.views.index'),
    (r'^polls/toritonn/$', 'mysite.polls.views.toritonn'),
)
-----

$ vi /ROOT/mysite/polls/views.py
-----
#coding=UTF8
from django.shortcuts import render_to_response
from mysite.polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    return render_to_response('polls/index.html',
                              {'latest_poll_list': latest_poll_list})

def tritonn(request):
    # ここでSennaのクエリー構文を使ってみる。
    latest_poll_list = Poll.objects.extra(where=['match(question) against("*DOR 雨" in boolean mode)'])
    return render_to_response('polls/toritonn.html',
                              {'latest_poll_list': latest_poll_list})
---

動作確認

以下にアクセス!
http://127.0.0.1:8000/polls/tritonn/

TORITONNNNNNNNNNNNNN

    * 今日は雨か?

と表示された!成功〜。