SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Django入門】DjangoアプリからDB(Oracle)接続 マイグレーション実行


・前回まで
前回にはWeb画面を作成する際のフォーム画面をDjangoのFormクラスを使用して試してみました。
Webの要素としてはまだまだ不十分なところはありますが、今回はDjangoアプリケーションからデータベースへの接続を試してみます。

プロジェクトは前回のものを再利用するので、ディレクトリ構成などは基本前回そのままです。

www.wantanblog.com

事前準備

データベース準備

DB接続を試すためにはデータベースそのものが必要なので準備します。
ローカルにインストールしてもいいしクラウドでもなんでもいいと思いますが対応しているDBは以下のようです。
データベース | Django ドキュメント | Django
参考:[Django]既存のデータベースを利用する方法 - Qiita

なにも準備がない場合はホスト環境にPostgreSQLなどをインストールするのが簡単だと思いますが、Djangoの勉強を勉強をしたいだけなのにデータベースを立てるのは。。というような場合にはPython に標準ライブラリとして組み込まれているSQLiteを使用するのがよさそうです。

私の場合は今回は既に準備があるoracleを使用するので、以降は基本的にはOracle向けになります。

接続用ライブラリのインストール

必要があればDjango環境に各データベース接続用のライブラリをインストールしておく。
ターミナルからpipでインストールを行う。

python -m pip install cx_Oracle

後はホストにクライアントアプリも必要になるようです。
Instant Client for Microsoft Windows (x64) 64-bit | Oracle 日本

Oracleクライアントインストール

DB接続にクライアントツールなどが必要な場合にはインストールする。

【最新】Oracleクライアントのインストール手順 - おじさんネットワークエンジニアの気まぐれ日記

インストールしたらクライアントツールから接続確認しておく。
・接続例

C:\Users\wanta>sqlplus wantan/wantan@192.168.142.12:1521/test_db

クライアントツールのパスを環境変数に通す必要があるみたいですが、後述しますが現状環境変数あたりがうまくいってないような感じです。。

接続設定

最近のPG言語などの設定は簡単になってきているのだとは思いますが、個人学習で初めて扱う言語などでは最初の壁になりうると思います。

Djangoの場合はプロジェクトディレクトリのsettings.pyファイルのDATABASES部分に設定を行います。
設定などは各自の環境に読み替えてください。

・ \form_pj\form_pj\settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'test_db',
        'USER': 'wantan',
        'PASSWORD': 'wantan',
        'HOST': '192.168.142.12',
        'PORT': '1521',
    }
}

・接続確認

PS C:\Users\wanta\Desktop\dev\django_pj\form_pj> python manage.py dbshell
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Mar 19 16:04:35 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.
                                                                                                                            
Last Successful login time: Sun Mar 19 2023 15:56:30 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

DjangoのDBマイグレーション

マイグレーション

マイグレーションとは移行のことですが、ここではDjangoプロジェクトのデータベースの定義を自動的に作成・管理することを指します。
DBのテーブル定義などはSQLや付属のGUIツールなどから行うことが一般的ですが、マイグレーションによりpythonコードからテーブル定義などを作成、更新します。

色々見てると使ったり使わなかったりするようですが、ここでは試しに使用します。

ざっくりとした流れはmodel.pyというモデルクラスを作成し、そこからマイグレーションファイルを作成、DBの定義へ反映を行います。

すぐに全体像をつかむのは簡単ではないと思いますので、先人のまとめなどを読みつつ手を動かしながら掴んでいけばいいのではないかと思います。
Django マイグレーション完全に理解した (基礎編) 🍏 - くろのて
Django マイグレーション まとめ - Qiita

モデルクラス

DBに反映させるテーブル定義をmodels.pyに定義します。
以下にモデルのサンプルを示します。

・models.py

from django.db import models

class test_emps(models.Model):
    name = models.CharField(max_length=100)
    mail = models.EmailField(max_length=200)
    gender = models.BooleanField()
    age = models.IntegerField(default=0)
    birthday = models.DateField()
マイグレーションファイルの作成

ターミナルからマイグレーションファイルの作成コマンドを実行します。

python manage.py makemigrations [アプリケーション名]

・実行例

PS C:\Users\wanta\Desktop\dev\django_pj\form_pj> python manage.py makemigrations form_app  
Migrations for 'form_app':
  form_app\migrations\0001_initial.py
    - Create model test_emps

・補足
今回はホストマシンにoracleクライアントの環境変数を設定したはずなのですが、pythonから実行するとうまくパスが設定できていなかったようなのでpythonのcx_Oracleで直接指定して実行しています。
そのためにmanage.pyに以下のように手を加えています。
上記コマンドの実行で問題なくそのまま流れるようなら特に行う必要はありません。
推奨される方法なのかも分かりません。
・form_pj/manage.py

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir=r"C:\Users\wanta\Oracle\instantclient_19_17")

以下の2行を追加。

import cx_Oracle
cx_Oracle.init_oracle_client(lib_dir=r"C:\Users\wanta\Oracle\instantclient_19_17")

パス指定では\がエスケープシーケンスとして扱われるため文字列前にrを付ける。

マイグレーションの実行

生成したマイグレーションファイルからマイグレーションを実行します。
実行コマンドはターミナルから以下のコマンドで実行できます。

python .\manage.py migrate

・実行例

PS C:\Users\wanta\Desktop\dev\django_pj\form_pj> python .\manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, form_app, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK       
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying form_app.0001_initial... OK
  Applying sessions.0001_initial... OK
PS C:\Users\wanta\Desktop\dev\django_pj\form_pj> 

これでマイグレーションが完了しているはずです。

結果確認

任意の方法でマイグレーションが行われてることを確認しておきます。
sqlplusでもDB接続ツールでもなんでも構いません。

テーブル名は、[アプリケーション名]_[指定したテーブル名]になるようです。

上記のマイグレーションコマンドでもしれっと出ていますが、Djangoの管理テーブルもマイグレーションされます。


時間がかかり過ぎたので、一旦ここまで。
・参考書籍

  • 第3章 モデルとデータベース
    • 3-1 管理ツールでデータベースを作ろう