ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

PostgreSQLにデータを挿入する

前回テーブルのつくりかたを試したので、今回はテーブルにデータを挿入する。

目次


外部ファイルの読み込み

前回、テーブルを削除したので再度テーブルをつくりなおす。
その際、ターミナル/PowerShellからSQL文を入力するのではなくSQLファイルをつくり、それを読み込む方法をとる。
その方が長いSQL文のときは便利。

SQLファイルをつくる

ここではボートレース(レガッタ)の結果を収録する想定でテーブルをつくる。
カラムは次のようにする。

レースno, 種目, 組別
1位, 1位のクルー名
2位, 2位のクルー名
3位, 3位のクルー名
4位, 4位のクルー名
5位, 5位のクルー名
6位, 6位のクルー名


create文のファイルをつくる。
create_tests.sql

create table tests (
    raceno     int         primary key,
    events     varchar(16) not null,
    groups     varchar(6),
    rank1      int,
    crew_rank1 text,
    rank2      int,
    crew_rank2 text,
    rank3      int,
    crew_rank3 text,
    rank4      int,
    crew_rank4 text,
    rank5      int,
    crew_rank5 text,
    rank6      int,
    crew_rank6 text
);


上のカラム定義について。

  • racenoにprimary key制約をつけた
    • primary keyはテーブル内に1つしか設定できない
    • primary keyは必須と一意性の両方をもつ制約
  • eventsにnot null制約をつけた
    • not null制約は必須項目という意味


ファイルを読み込む

まずはPostgreSQLサーバーを起動する。
サーバー起動と停止の仕方は以前の記事を参照。

Windows10にPostgreSQLをインストールする - ローイングファンの日記

macOS10にPostgreSQLをインストールする - ローイングファンの日記

起動したらtestデータベースに接続する。
接続と切断の仕方は以前の記事を参照。

PostgreSQLにテーブルをつくる - ローイングファンの日記

ファイルを読み込む書式は次のとおり。

\i ファイル名

実際に試してみる。

\i create_tests.sql

次のように返ってくればファイルをもとにテーブルが作成されている。

CREATE TABLE

どのようなテーブルができたか確認する。

\d tests

返答 Windows10

f:id:rowingfan:20180419124309p:plain

macOS10

f:id:rowingfan:20180419124333p:plain

\d テーブル名カラム名、データ型、制約が確認できる。
表の最後にあるIndexes:について。

  • primary key制約をつけたカラムはインデックスになる
  • インデックスになっているカラムは検索のときに高速なるなどの特徴がある

インデックスについての詳細はPostgreSQLドキュメントに載っている。

PostgreSQLドキュメント SQL言語 11章.インデックス
https://www.postgresql.jp/document/10/html/indexes.html

テーブルにデータを挿入する

先ほどつくったテーブルにデータを挿入する。
データを挿入するにはinsert文を使う。書式は次のとおり。

insert into テーブル名 (カラム名1, カラム名2, .....) values (値1, 値2, ...);

値のカッコをカンマでつなぐと同時に複数のレコードを挿入できる。

実際にファイルをつくって試してみる。
今回は3位までの結果を2レース(レコード)分挿入する。

insert_tests.sql

insert into tests (
    raceno,
    events,
    groups,
    rank1,
    crew_rank1,
    rank2,
    crew_rank2,
    rank3,
    crew_rank3)
values (
    1,
    '男子エイト',
    '予選A組',
    1,
    'A大学',
    2,
    'B大学',
    3,
    'Cクラブ'
    ),
    (
    2,
    '男子エイト',
    '予選B組',
    1,
    'D大学',
    2,
    'E大学',
    3,
    'Fクラブ'
);


文字列は' 'シングルクォートで囲む必要がある。

上のファイルをデータベースに読み込む。

\i insert_tests.sql

次のように返ってくれば挿入成功。

INSERT 0 2


Windows10とPostgreSQLの文字エンコーディング

Windows PowerShellから挿入するとき、次のようなエラーになる場合がある。

ERROR: invalid byte sequence for encoding "SJIS": 0x88 0x27


PowerShellPostgreSQLの文字エンコーディングの違いなので次のように設定を変更する。

\encoding utf-8

変更した設定を確認する。

\endoding

返答。

UTF8


上のように文字エンコーディングUTF-8に変更できていればデータを挿入できる。

SQL言語 select文

先ほど挿入したデータを確認する。
データを検索するにはselect文を使う。
書式は次のとおり。

select カラム名 from テーブル名 条件;

実際に試してみる。

select * from tests;


上のselect文の説明。

  • *は全ての意味。今回は全てのカラム
  • testsテーブルから検索
  • 条件はないので全てのレコードが表示される

結果

windows10

f:id:rowingfan:20180419124457p:plain

macOS10

f:id:rowingfan:20180419124532p:plain

表示の文字化け

Windows PowerShellの場合、表示するときに文字化けをおこすことがある。
正しく表示するため文字エンコーディングを変更する。
今回の場合、データを挿入するときに変更した文字エンコーディングUTF-8からSJISに戻す。

\encoding SJIS

確認する。

\encoding

返答。

SJIS

これで正しく表示される。

拡張表示

カラム数が多いと横長になりすぎて画面におさまらず見づらい。そのようなときは縦表示にする拡張表示機能がある。
拡張表示設定

\x

返答 Windows10

拡張表示は on です。

macOS10

Expanded display is on.


拡張表示がオンの状態でテーブルを表示すると次のようになる。

select * from tests;

返答

f:id:rowingfan:20180419124630p:plain

拡張表示をオフにしたいときはもう一度\xを入力する。

\x

返答
Windows10

拡張表示は off です。

macOS10

Expanded display is off.



作業が終わったらデータベースを切断。
PostgreSQLサーバーを停止。


次回はselect文のwhere句を試します。
今回の動作確認環境
macOS 10.13.3
ターミナル 2.8.2
Windows10 1709
Windows PowerShell 5.1.16299.251
PostgreSQL 10.3