[PostgreSQL] ユーザ作成

create user user1;
create user user1 with password ‘pass’;
create user user1 with password ‘pass’ valid until ‘Jan 1 2022’;
create user user1 with password ‘pass’ superuser;
create user user1 with password ‘pass’ createdb createrole;

オプション
h: サーバホスト
p: ポート
U: user
d: データベース作成権限
D: データベース作成できない権限
l: ログイン権限
L: ログイン不可権限
r: ユーザー作成権限
R: ユーザー作成不可権限
s: スーパーユーザー権限
S: スーパーユーザー不可権限
P: パスワード設定

なるほど、少しPostgreSQLにも慣れてきた。というより、CRUDまでいくと、やった感はある。

[PostgreSQL] データ型

### character型
– character(整数)と書き、その桁数分、必ず文字で埋まる列
– 文字が定義した長さに満たない場合、半角スペースで埋まる
– 長さがオーバーしている場合はそこで自動的に切られる

create table ${table} (${列名} character(桁数));
alter table ${table} add column ${列名} character(10);
select cast(‘Hello’ as character(10));

### character varying(整数)、character varying
– character varying(整数)とvarchar(整数)は同じ
– スペース埋めがされない、登録した文字の長さになる
– 整数を省略したcharacter varingは1GBまで入る文字列

create table ${table} (${列名} character varing(桁数));
alter table ${table} add column ${列名} character varing(10);
select cast(‘Hello’ as character varing(10));

### text型
character varyingと同じもの

### integer
整数値を保存できる型
最小値は-2,147,483,648、最大値は2,147,483,647
select cast(2.4 as integer);
select cast(2.5 as integer);

### smallint, bigint
smallint, bigintはintegerと同じく整数値を保存できる型
smallintは、最小値は-32,768、最大値は32,767
bigintは、最小値は-9,223,372,036,854,775,808、最大値は9,223,372,036,854,775,807

### numeric, decimal
numericとdecimalは小数が可能な数値型。どちらも同じ意味

### boolean
true, false, nullの3つの値

なるほど、大分OKだわ

[PostgreSQL] CRUD

### データ挿入
insert into department (department_code, department_name) values (‘a’, ‘営業部’);
insert into department (department_code, department_name) values (‘b’, ‘総務部’);
insert into department values (‘c’, ‘製造部’);
insert into department (department_code, department_name) values (‘d’, ‘経理部’);
insert into department (department_code, department_name) values (‘e’, ‘人事部’);
insert into department (department_code, department_name) values (‘f’, ‘物流部’);

### データ取得
select * from department;
select department_code, department_name from department;
select department_code as “部署コード”, department_name as “部署名” from department;
select department_code, department_name from department where department_code = ‘b’;

### データ更新
update department set department_name = ‘hoge’ where department_code = ‘a’;

### データ削除
delete from department;
delete from department where department_code = ‘c’;
delete from department where department_code in(‘a’, ‘c’, ‘e’);

[PostgreSQL] 基礎編

PostgreSQLの他にも、Oracle Database, SQL Server, MySQLなどがある
ライセンスが無料、PostgreSQL Global Development Groupが開発を行なっている
参考になる情報がそこまで多くない

### PostgreSQL接続
$ psql –version
psql (PostgreSQL) 14.2 (Ubuntu 14.2-1.pgdg20.04+1)
$ sudo -u postgres psql

### データベース作成、移動
postgres=# create database testdb;
CREATE DATABASE

postgres=# \c testdb;
You are now connected to database “testdb” as user “postgres”.
testdb=#

### テーブル作成
CREATE TABLE department(
department_code character varying(10) NOT NULL,
department_name character varying(100),
CONSTRAINT pk_department PRIMARY KEY(department_code)
);

– テーブル一覧
testdb=# \dt;
List of relations
Schema | Name | Type | Owner
——–+————+——-+———-
public | department | table | postgres

– テーブルの中身
testdb=# \d department;
Table “public.department”
Column | Type | Collation | Nullable | Default
—————–+————————+———–+———-+———
department_code | character varying(10) | | not null |
department_name | character varying(100) | | |
Indexes:
“pk_department” PRIMARY KEY, btree (department_code)

コマンドは違うが、MySQLと基本的な考え方はある程度同じっぽいな

[PostgreSQL] スキーマとは

PostgreSQLのスキーマとは?
– 1つのデータベースの中に複数設定することができる名前空間のこと
– テーブルやビュー、インデックスなどはスキーマの下に配置される
Database -> schema -> table, view, sequence, index

CREATE DATABASEをすると、6つのスキーマが作成される
– information_schema: データベースのメタデータを取得するために利用されるビュー
– pg_catalog: PostgreSQLがシステム的に備えているオブジェクトを格納しているスキーマ
– pg_toast: PostgreSQLで可変長データ型のデータを扱えるようにToastの仕組みを実行するスキーマ
– pg_temp_${backendID}: 一時テーブル用のスキーマ
– public: 標準で使用されるスキーマ

CREATE SCHEMA test_schema;
CREATE SCHEMA test_schema CASCADE;

なるほどー

phpspreadsheetを使いたい

$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar require phpoffice/phpspreadsheet

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

$sheet->setCellValue('B1', 'English');
$sheet->setCellValue('C1', '数学');
$sheet->setCellValue('A2', 'Aさん');
$sheet->setCellValue('A3', 'Bさん');
$sheet->setCellValue('B2', '90');
$sheet->setCellValue('B3', '80');
$sheet->setCellValue('C2', '70');
$sheet->setCellValue('C3', '95');

$writer = new Xlsx($spreadsheet);
$writer->save('score.xlsx');

なるほどー

k8s 元に

apiVersion: v1
kind: Pod
metadata:
  name: web-pod
  labels:
    svc2pod: web
spec:
  containers:
  - name: nginx
    image: nginx:1.17.6-alpine
    ports:
    - name: http
      containerPort: 80

apiVersion, kind, metadata, spec
labelsでリソースを分類する

Dockerで簡単な構成でイメージ開発とテストを行い、その後でk8sの複雑な構成で利用する

なるほどー、Dockerをやらんとヤバいな…

Composeのその他の機能

ComposeコマンドをリモートのDockerホストに対して実施して、1つのホストから複数のホストにアプリを展開することができる

### 環境変数

version: '3.7'
services:
  web:
    image: ${DHUB}/c5env:${IMG_VER}
    container_name: c5env

その他の命令

version: '3.7'
services:
  python:
    image: alpine:3.10.3
    container_name: alpine
    command: ["tail", "-f", "/dev/null"]
    tty: true
    env_file: python.env
    stop_signal: SIGKILL
    network_mode: "none"

[Docker-compose] 基本

Composeの定義内でイメージが置かれるディレクトリとDockerfile名を指定すれば、docker-composeコマンドの発行時にDockerfileによるビルドも自動で実施する

$ tree
.
├── app
│   ├── Dockerfile
│   └── src
│   └── server.py
├── docker-compose.yml
└── web
├── Dockerfile
└── html
└── index.html

./web/Dockerfile

From nginx:1.17.5-alpine
COPY ./html/ /usr/share/nginx/html/
CMD["nginx", "-g", "daemon off;"]

./docker-compose.yml

version: '3.3'
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
    - 8081:80
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    image: c5dev1_nginx
    container_name: c5dev1_nginx
    ports:
    - 8080:80

build: でビルドする
image: がイメージ名
サービス名とイメージのリソースを置くディレクトリ名を統一する方が良い

$ sudo docker-compose build

bindで動作検証して、OKだったら、ビルドする

version: '3.7'
services:
  web:
    build:
      context: ./web
      dockerfile: dockerfile
    depends_on:
      - app
    ports:
      - 8080:80
    environment:
      APP_SERVER: http://app:80
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    depends_on:
      - db
    environment:
      REDIS_HOST: db
      REDIS_PORT: 6379
      REDIS_DB: 0
  db:
    image: redis:5.0.6-alpine3.10
    volumes:
      - c5kvs_redis_volume:/data
volumes:
  c5kvs_redis_volume:
    driver: local

[Docker-compose] WordPressとMySQLを展開

docker-compose.local.yml

version: '3.3'
services:
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
    ports:
    - 8080:80
    volumes:
    - ./web/html:/usr/share/nginx/html

/web/Dockerfile

From nginx:1.17.5-alpine
COPY ./html/ /usr/share/nginx/html/
CMD ["nginx", "-g", "daemon off;"]

/web/html/index.html

	<title>Document</title>
</head>
<body>
	<h1>hello</h1>
</body>

$ sudo docker-compose -f docker-compose.local.yml up -d –build