publicスキーマってなんじゃ!!!
TL;DR(要約すると・・・)
- MySQLではデータベースとスキーマは同じと思って大丈夫。
- PostgreSQLではデータベースがあってその下にスキーマが存在する。
- デフォルトでは public スキーマが作成される。
これまでの経緯
とある日の昼下がり
BOSS: ちょっと悪いんだけどさ、検証用のPostgreSQLにdevelopスキーマ追加してもらえないかな?
私: developスキーマですね、いいっすよ。
私 : (ユーザ作って、DB作って、権限付与してと…)
私: BOSS!developスキーマできました!
BOSS: ありがとう!
BOSS: ・・・ん? これpublicに繋げばいいの?
私: ・・・ん? public? ほんとだ!publicスキーマってなんじゃ!!!
というわけで、今回は MySQL と PostgreSQL のスキーマについて確認しましょう。
必要なもの
Docker上に MySQL と PostgreSQL を構築し確認していきますが、
ローカル環境でも問題無いです。
また、データベースの操作はA5 SQL Mk-2を使用します。
- 必須
- MySQL:8.0
- PostgreSQL:12.3
- 任意
- Docker, Docker Compose
- A5 SQL Mk-2
- Sublime Text
MySQLで確認
DockerComposeでMySQLを起動して、
version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
TZ: 'Asia/Tokyo'
ports:
- "3306:3306"
A5M2 で接続して、

developデータベースとテーブルを作成して、
/* データベースの作成 */
CREATE DATABASE develop;
/* テーブルの作成 */
CREATE TABLE develop.schema_info (
id int,
name varchar(255)
);
/* 適当にデータを insert */
INSERT INTO develop.schema_info values(1, 'MySQL.develop');
一度接続を閉じてDBの内容をA5M2で確認してみる。

RDBMS(local_mysql) > Database(develop) > Table(schema_info) の構成なので、データベースとスキーマは同じという認識でも問題なさそう。
次は、PostgreSQLを確認してみます。
PostgreSQLで確認
MySQLと同様に確認します。
※ PostgreSQL:12.3 だと A5M2 のバージョンによってはエラーが出るので要注意!詳細は下部のおまけにて
DockerComposeで PostgreSQL を起動して、
version: '3'
services:
postgres:
image: postgres:11.8
environment:
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
A5M2 で接続して、

developデータベースとテーブルを作成して、
/* データベースの作成 */
CREATE DATABASE develop;
/* テーブルの作成 */
CREATE TABLE schema_info (
id integer,
name varchar(255)
);
/* 適当にデータを insert */
INSERT INTO schema_info values(2, 'PostgreSQL.develop');
一度接続を閉じてDBの内容を確認してみる。

いつの間にか public がいた! そして develop がいない!!
developに接続できるようにDB設定を修正してテーブルを作り直す


Database(local_postgres.develop) > schema(public) > Table(schema_info) の構成なので、MySQLとは異なりデータベースとテーブルの間にスキーマが挟まっていることが確認できた。
エピローグ
私: BOSS!! スキーマの概念について私が間違っておりました!接続手順書もつけるので許してください!
BOSS: うむ!! 手順書ありがとう!助かります!
みんな開発に着手できましたとさ、めでたしめでたし。
おまけ
PostgreSQL:12.3 に A5M2:2.14.1 で接続すると

が出てくる。
ポスグレ内の構成が変わったことが原因みたい。
トピック: 【不具合報告】接続エラー |