11.1 データベース
11.1.1 主なリレーショナルデータベース
現在、主に使われているリレーショナルデータベース製品は以下。
(1)Oracle
エンタープライズ領域(基幹系・勘定系システム)で圧倒的なシェアがある有償データベース。高可用性を確保する仕組み(RAC: Real ApplicationCluster)やディザスタリカバリーの仕組みを持ち、安定性・堅牢性に優れている。費用は高め、管理・運用に専門知識が必要になることが多い。
(2)My SQL
GPL(無償)と商用ライセンスのデュアルライセンスで提供され、商用ライセンスでは有償サポート(MySQL Enterprise)を受けることができる。現在ではOracle社によって開発、提供されている。主にWeb系システムで広く採用されている。
(3)Microsoft SQL Server
Microsoftが提供するリレーショナルデータベース。Windows環境との親和性に優れ、Windows Serverの場合ほぼこれが採用される。
(4)PostgresSQL
無償のオープンソースのリレーショナルデータベース。商用利用可能な、PostgreSQL Licenseで提供されている。オープンソースではあるが、堅牢性が高く、高度な機能を提供。さらに、SQL標準準拠度が高い。ただし、無保証(保守サポートサービスを提供する会社はある)
この講座では、オープンソースで無性のPostgreSQLを使うこととし、以降の説明はPostgreSQLを使った場合である。
11.1.2 PostgreSQLのデータベース構造

データベースクラスタ
1つのPostgreSQLインスタンス(サーバープロセス)が管理する、データベース群
データベース
アプリケーションやプロジェクト単位でデータを分割・独立させるための単位。アプリケーションやプロジェクトごとにデータベースを作成してこれを使う。PostgreSQLでは、デフォルトでpostgresという名前のシステム管理用データベースが用意されている。
スキーマ(PostgreSQL独自)
- データベース内にテーブルや関数などのオブジェクトを分類・整理して格納する「名前空間」
- テーブルやビューなどのオブジェクトはスキーマに所属。同じデータベース内であれば、スキーマ名を分けて複数のシステムでテーブル名の競合を防いだり、アクセス権限を管理したりできる
- 初期状態で自動的に「public」スキーマが生成されており、特に明示的にスキーマ名を指定しなかった場合これが使われる
- 以下のコマンドで切り替えを行う。
SET search_path = [スキーマ名];
11.1.3 Djangoとの接続準備
(1)インストール
PostgreSQLの公式サイトのダウンロードページに、OSごとのインストール方法がありますので、これに従ってインストールを行います。
PostgreSQLには、標準でマンドラインベースの対話型フロントエンド「psql」が付いてきますので、これを使って準備を行います。
(2)データベースの作成
まず、スーパーユーザー権限でpsqlに入ります。
'\l' コマンドで登録されているデータベースの一覧を表示します。
# \l
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
--------------------+----------+----------+-----------------+---------+-------+--------+-----------+-----------------------
postgres | postgres | UTF8 | libc | C | C | | | =Tc/postgres +
| | | | | | | | postgres=CTc/postgres+
| | | | | | | | v3_user=C/postgres
template0 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
次に、アプリケーション用のデータベースを作成します。
# CREATE DATABASE jfootball;
登録されているデータベースの一覧を表示し、新たにjfootballというデータベースが生成されていることを確認します。
# \l
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
--------------------+----------+----------+-----------------+---------+-------+--------+-----------+-----------------------
jfootball | postgres | UTF8 | libc | C | C | | |
postgres | postgres | UTF8 | libc | C | C | | | =Tc/postgres +
| | | | | | | | postgres=CTc/postgres+
| | | | | | | | v3_user=C/postgres
template0 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(3)ユーザーの登録
'\du'コマンドで、現在登録されているユーザーを確認します。
# \du
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
次にユーザーを登録します。下はユーザー名'jf_user' パスワード'jfootball'で登録する例です。
# CREATE USER jf_user with password 'jfootball';
ユーザーが登録されていることを確認します。
# \du
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
jf_user |
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
(4)権限の設定
jf_userにデータベースを作成する権限を与えます。
ALTER ROLE jf_user with createdb;
権限が与えられていることを確認します。
# \du
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
jf_user | Create DB
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
Jfootballデータベースに対し、jf_userが接続、スキーマを作成、一時テーブルの作成することを許可します。
# GRANT CONNECT, CREATE, TEMPORARY ON DATABASE jfootball TO jf_user;
権限が与えられていることを確認します。
# \l
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
--------------------+----------+----------+-----------------+---------+-------+--------+-----------+-----------------------
jfootball | postgres | UTF8 | libc | C | C | | | =Tc/postgres +
| | | | | | | | postgres=CTc/postgres+
| | | | | | | | jf_user=CTc/postgres
postgres | postgres | UTF8 | libc | C | C | | | =Tc/postgres +
| | | | | | | | postgres=CTc/postgres+
| | | | | | | | v3_user=C/postgres
template0 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
さらに、\cコマンドで接続先データベースを新たに作ったjfootballに切替えてから、ユーザー(jf_user)に対し、publicスキーマに対する権限を許可します。
# \c jfootball
# GRANT ALL ON SCHEMA public TO jf_user;
11.1.4 Djangoからの接続
(1)psycopg2のインストール
psycopg2 は PythonからPostgreSQLデータベースを操作するための最も標準的で広く使われているライブラリ(アダプター)です。Mac用にコンパイルされているバイナリモジュールをインストールするには、以下のようにします。
% poetry add psycopg2-binary
(2)settings.pyのデータベース設定変更
DATABASEの定義を以下のように書き換えます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': "jfootball",
'USER': "jf_user",
'PASSWORD': "jfootball",
'HOST': "",
'PORT': "",
}
}
ただし、NAME, USER, PASSWORDのところに入る値をここに直接書くのは危険なので、.envなどに記載して呼び出す方が良いでしょう。
(3)マイグレート
すでに、migrationファイルはあるので、単純にdjangoのマネージャでmigrateを実行すれば、モデルがデータベースに反映されます。
% python manage.py migrate jfootball_record