Django でモデルをマイグレートする

Python

前回の続きです。

Django でテンプレートファイルを追加する
前回の続きです。ほぼ udemy 「【3日でできる】はじめての Django 入門」の内容の備忘録になります。テンプレートファイルとは前回まででは、View に該当する view.index 関数で、直接 HttpResponse ...

ほぼ udemy 「【3日でできる】はじめての Django 入門」の内容の備忘録になります。

今回すること

Django では、DB のことをモデルと呼ぶらしいです。
(個人的にはモデルってドメインロジックとかも含めるイメージだから、インフラ層のみ限定したものをモデルと呼ぶことに違和感がありますが・・・たぶんまだ私の理解が及んでいないのでしょう)

今回は、「マイグレーションファイル」を作って、マイグレーションして DB 上にテーブルをつくります。
ちなみに「マイグレーション」とは

手順としては、以下の感じになります。

  1. モデルファイル(model.py)の作成
    • モデルファイルはクラスで定義する
  2. モデルファイルをマイグレーションファイルに変換する
  3. マイグレーションファイルを DB にマイグレートし、テーブルを作成する

※ DB には Sqlite3 を使用します。一応、MySQL とか PostgresSQL とかも選べるそうですが、とりあえず動かすだけなので Sqlite3 で十分です。

モデルファイル(model.py)の作成

モデルファイルには、DB に作成するテーブルの構成が書かれます。
python ではテーブル構造をクラスで記述するみたいです。
(O/R マッピングがデフォってこと?それともここでいうクラスは、あくまでデータ構造でありオブジェクトの定義ではないということ?ちょっとここら辺よくわかっていないですが、C# でいうコードファーストに近いのかなと解釈しています

今回は、udemy のまんまですが、以下のように model.py を定義しました。

from django.db import models
# 基本的に、以下のように「models.~」を利用してカラムの型を指定します

class Post(models.Model):
    # 文字列(max_length で最大長を指定)
    title = models.CharField(max_length=100)
    # 日付
    published = models.DateTimeField()
    # 画像データ(upload_to でデータの保存先パス)
    image = models.ImageField(upload_to='media')
    # 文字列(長めの文章など、CharField よりも長いデータに向いているらしい)
    body = models.TextField()

モデルファイルをマイグレーションファイルに変換

準備

今回のモデルファイルでは ImageField という型を使用しています。
これを使うためには、あらかじめ準備が必要らしいので、以下を実行して Pillow というものをインストールしておきます。

(env1) C:¥Users¥hoge¥myfirstapp> pip install Pillow

実行

以下を実行し、 model.py ファイルをマイグレーションファイルに変換します。

(env1) C:¥Users¥hoge¥myfirstapp> python .\manage.py makemigrations

すると、以下のように表示され、0001_initial.py というものが生成されました。

Migrations for 'posts':
  posts\migrations\0001_initial.py
    - Create model Post

このマイグレーションファイルの生成は、Django の中でいろいろやってくれているらしく、プロジェクトは以下のアプリケーション内で、前回実行時と比較して変更があったところのみ、マイグレーションファイルを生成してくれるらしいです。(今回はアプリは posts しか存在しませんが)
ですので、モデルを変更した場合は、単純にこのマイグレーションファイルの変換を実行すれば効率よく DB の構造を更新で切るっぽいですね。

マイグレートして DB のテーブルを作る

上記で作成したマイグレーションファイルをマイグレートすることで、DB のテーブルを作成・更新することができます。

(env1) C:¥Users¥hoge¥myfirstapp> python .\manage.py migrate

以下のように表示されれば成功です。これにより、DB にテーブルが生成されているそうです。

perations to perform:
  Apply all migrations: admin, auth, contenttypes, posts, sessions
Running migrations:
  Applying posts.0001_initial... OK

今回は DB に Sqlite3 を使用していますので、Sqlite の中身を確認してみます。

(env1) C:¥Users¥hoge¥myfirstapp> sqlite3 db.sqlite3

とすると、以下のように対話モードになります。

SQLite version 3.8.1 2013-10-17 12:57:35
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

ここで、以下のようにテーブルを列挙するコマンドを入力すると、 posts_post というテーブルが存在していることがわかります。

sqlite> .tables
auth_group                  django_admin_log
auth_group_permissions      django_content_type
auth_permission             django_migrations
auth_user                   django_session
auth_user_groups            posts_post # ←これ
auth_user_user_permissions

Sqlite3 のインストール

私の環境では sqlite3 というコマンドが実行できませんでした。よくある

'sqlite3' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。

というエラーです。

SQLite Download Pageにある
Precompiled Binaries for Windows
http://www.sqlite.org/2013/sqlite-shell-win32-x86-3080100.zip
を解凍すると、 sqlite3.exe を取得できます。

コメント

タイトルとURLをコピーしました