日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

Model その1

かなり間があいてしまいました。ようやくですが、Modelのことをざっくり書いていきます。

Modelってなに?

Djangoが用意しているModelは、データ永続層にアクセスするコンポーネントです。要は、O/Rマッパーでクラスとテーブルが1対1でマッピングされ、1インスタンスが1レコードを表すアクティブレコードのPython版です。

これを使うと(基本的には)SQLレスで、データベースへのアクセスが可能になります。

Modelクラスを書く

Modelクラスを実際に定義してみます。Modelクラスは django.db.models.Modelのクラスを継承して定義します。

ちなみに Modelクラスを定義するときはアプリケーションディレクトリ内のmodels.pyに定義していきます。ファイルを分割したい時は、models.pyの中でModelクラスが定義されたファイルを importします。

(他に良い方法があったら、誰か教えて!!)

from django.db import models

class Parson(models.Model):
    name    = models.TextField(db_column='name', null=False, blank=False, default='nanashi-san')
    address = models.TextField(db_column='address', null=False, blank=False, default='nanashi-san')

こんな感じです。django.db.modelsパッケージにはModelクラスを定義するのに必要な基底クラスやフィールドが入っています。Djangoのリファレンスを見ながら定義するのが確実だと思います。

利用するデータベースを設定する

Modelクラスの定義が終わったら、次は接続先データベースの設定を行います。久々に settings.py を変更します。

DATABASE_ENGINE = 'postgresql_psycopg2'
DATABASE_NAME = 'hatena-sample'
DATABASE_USER = 'postgres'
DATABASE_PASSWORD = 'password
DATABASE_HOST = 'localhost'
DATABASE_PORT = '5432'

自分の環境では、PostgreSQLが入っていたので、こんな設定になっています。DB接続部分は、psycopg2を使っています。Python/Djangoとは別パッケージなので、easy_install などでインストールしてください。

それとデータベースをつくるのも忘れずに。

テーブルを作る

テーブルを作るときは DDL を作る必要はありません。manage.pyのサブコマンドを利用します。

python manage.py syncdb

ちゃんと接続先が合っていれば、これだけでテーブルを作ってくれるはずです。

ちなみに syncdbコマンドですが、CREATE TABLE文を発行してくれますが、DROP TABLE文は発行してくれません。Modelにフィールドを追加したときは、自分でテーブルを削除する必要があります。面倒だと思ったときは、プラグインを使いましょう。

Modelクラスを使ってデータ登録する

今回は django の shell からデータ登録をします。

python manage.py shell

シェルを起動したら、次のように打ち込みます。

from app1 import models
parson = models.Parson()
parson.name = 'new-name'
parson.address = 'new-address'
parson.save()

これでデータが1件登録完了。データベースに直接SQLを発行して登録したデータを確認してみると

hatena-sample=# select * from app1_parson;
 id |   name   |   address
----+----------+-------------
  1 | new-name | new-address
(1 行)

登録されてる!

と、こんな感じでデータ登録は非常に簡単です。

まとめ

Django の Modelは割と簡単に定義でき、テーブル作成とデータ登録までは非常に簡単でした。

ただ生成されるテーブル名がapp1_parsonになっていたり、若干気になります。次回はこのあたりのカスタマイズと他のフィールドを使ってみます。

記事が書き終わってから、parsonって typoしていることに気が付きました。そっとしておいてください。。。