ブログとか作ってみたいかと その3

データベースの設定

 プロジェクトを作成したので、次に使用するデータベースの設定を行います。

 tgBlogディレクトリ配下にある「dev.cfg」ファイルを
編集することによって設定が可能となります。

 「dev.cfg」ファイルを開くと、以下のように書かれた箇所が見れます。

# DATABASE

# pick the form for your database
# sqlobject.dburi="postgres://username@hostname/databasename"
# sqlobject.dburi="mysql://username:password@hostname:port/databasename"
# sqlobject.dburi="sqlite:///file_name_and_path"

# If you have sqlite, here's a simple default to get you started
# in development
sqlobject.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite"

 これをみると、PostgreSQLMySQLsqliteのうちいずれかが選択可能なようです。

また、デフォルトはsqliteであり、tgBlogディレクトリ配下に
devdata.sqliteという名前のファイルを作成するようになっています。

tgBlogでは、sqliteを用いて、またtgBlogディレクトリ配下に
データベース用のファイルを作成しようと考えているので、
特に設定を変更する必要もないのですが、ファイル名だけでも変更しておくことにします。

sqlobject.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite"

コメントアウト

#sqlobject.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite"

そして、

# sqlobject.dburi="sqlite:///file_name_and_path"

という部分のコメントをはずし、パスとファイル名を指定します。

sqlobject.dburi="sqlite:///home/hoge/python/tg/tgBlog/tgblog.db"

Modelの編集

 データベースの設定が終わったので、
次にデータベース上の各情報が保存されているテーブルと
やりとりを行うためのModelの編集を行います。

「tgBlog/tgblog」ディレクトリ配下にあるmodel.pyを編集します。

model.pyを開くと以下のようにコードが書かれてます。

from datetime import datetime
from turbogears.database import PackageHub
from sqlobject import *
from turbogears import identity

hub = PackageHub('tgblog')
__connection__ = hub

# class YourDataClass(SQLObject):
#     pass
・
・
・

・・・以降には、認証用の「Visitクラス」、「VisitIdentityクラス」、
「Groupクラス」、「Userクラス」、「Permissionクラス」が定義されています。

では、今回扱うそれぞれの情報について、クラスを宣言していきます。

ブログ情報
class Blog(SQLObject):
    blog_name = UnicodeCol(length=32)
    description = UnicodeCol(length=128)
    user_id = ForeignKey('User')
    entries = MultipleJoin('Entry')

 クラスは、SQLObjectを継承して作成します。
 Blogクラスには、ブログの名前、ブログの説明、所有するユーザを表すID、そのBlogに登録されたエントリについての4つの情報を定義します。

エントリ情報
class Entry(SQLObject):
    title = UnicodeCol(length=64)
    body  = UnicodeCol(length=2048)
    created = DateTimeCol(default=datetime.now)
    blog_id = ForeignKey('Blog')
    comments = MultipleJoin('Comment')
    categories = RelatedJoin('Category')

 Entryクラスには、エントリのタイトル、本文、作成日、エントリが登録されるブログのID、コメント、カテゴリについて定義します。

Comment情報
class Comment(SQLObject):
    user_name = UnicodeCol(length=32)
    title    = UnicodeCol(length=32)
    comment  = UnicodeCol(length=256)
    created  = DateTimeCol(default=datetime.now)
    entry_id = ForeignKey('Entry')

 Commentクラスには、コメントの投稿主の名前、タイトル、コメント本文
作成日、どのエントリに対してのコメントなのかの情報について定義します。

Category情報
class Category(SQLObject):
    category_name = UnicodeCol(unique=True,length=16)
    entris = RelatedJoin('Entry')

 Categoryクラスには、カテゴリ名と、各カテゴリが付いているエントリ情報に
ついて定義します。

テーブルの作成

 クラスを定義したら、テーブルを作成します。
 テーブルの作成は、tgBlogディレクトリで
以下のコマンドを入力することでできます。

$ tg-admin sql create

テーブルの作成が成功すると、以下のようなメッセージが出力されます。

Using database URI sqlite:///home/hoge/python/tg/tgBlog/tgblog.db

そして、

-rw-r--r-- 1 hoge hoge 23552 1027 23:10 tgblog.db

というファイルが作成されます。

テストデータの入力

 テストデータを入力するために、コマンドシェルを立ち上げます。
シェルを立ち上げるためには、「tg-admin」コマンドを「shell」オプションを付けて実行します。

$ tg-admin shell

すると、シェルが立ち上がります。

Python 2.4.3 (#1, Oct 23 2006, 14:19:47)
[GCC 4.1.1 20060525 (Red Hat 4.1.1-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(CustomShell)
>>>
ユーザ情報
User(user_name='hoge',email_address="hoge@hoge.com",display_name='hoge',password='hoge')
>>> u = User.get(1)
>>> u
>>> <User 1 user_name=u'hoge' email_address=u'hoge@hoge.com' display_name=u'hoge' password=u'hoge' created='datetime.datetime...)'>
ブログ情報
>>> Blog(blog_name='Test Blog',description='Test',user_id=1)
<Blog 1 blog_name=u'Test Blog' description=u'Test' user_id=1>
>>> b = Blog.get(1)
>>> b
<Blog 1 blog_name=u'Test Blog' description=u'Test' user_id=1>
カテゴリ情報
>>> Category(category_name='test')
<Category 1 category_name=u'test'>
>>> c = Category.get(1)
>>> c
<Category 1 category_name=u'test'>
エントリ情報
>>> Entry(title=u'test' body=u'test' created='datetime.datetime...)' blog_id=1)
<Entry 1 title=u'test' body=u'test' created='datetime.datetime...)' blog_id=1>
>>> e = Entry.get(1)
>>> e
<Entry 1 title=u'test' body=u'test' created='datetime.datetime...)' blog_id=1>

 カテゴリの追加

>>> e.addCategory(1)
>>> e.categories
[<Category 1 category_name=u'test'>]
コメント情報
>>> Comment(user_name='test',title='title_comment',comment="comment test",entry_id=1)
<Comment 1 user_name=u'test' title=u'title_comment' comment=u'comment test' created='datetime.datetime...)' entry_id=1>
>>> c = Comment.get(1)
>>> c
<Comment 1 user_name=u'test' title=u'title_comment' comment=u'comment test' created='datetime.datetime...)' entry_id=1>