ひよこ、通勤中。

通勤中の電車の中でひよこは何を思うのか。

postgresqlでcsvファイルから一括upsert

全部1行ずつupsertしてたら100万件で数時間かかったので、 他の解決策を考える。

1時テーブルを作成しupdate + insert

PostgreSQL CSV 取り込み upsert | odekakeshimasyo.me

  1. copy from => tmp table
  2. tmp tableからUpdate
  3. tmp tableからUpdateした分を削除してInsert

PostgreSQLメモ

Activeで何クエリが走ってるか

select pid, query from pg_stat_activity where state = 'active';

クエリジョブのkill

select pg_cancel_backend(pid);

Pythonのdocstringの書き方について

3つの書き方

自分の基本的な書き方

基本的にはreSTの書き方しているつもり。

''' 1行関数・クラス説明

複数行説明...

:param type param-name: param-description
:return: return-description
:rtype: return-type
'''

docstringのtypeの書き方

docker-composeよく使うコマンド

コマンド

コマンド 意味
docker-compose build docker-compose.ymlの中身を変更したら実行する
docker-compose up 起動
docker-compose run {サービス名} {command} コマンドを実行する
docker-compose rm {サービス名} containerの削除。buildした内容を破棄する

PostgreSQLの設定

user:username, pass:secret, dbname:username でDBを作る。

  db:
    restart: always
    image: postgres:alpine
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: secret
    volumes:
      - ./path/to/schema.sql:/docker-entrypoint-initdb.d/01_schema.sql

volumes: を指定すると この例なら自作schema.sqlを初回起動時に実行する。 テストデータ作ったり、スキーマ作ったりするのに便利。要らなかったらvolumes:ごと書かない

digdag使い方メモ

REST API のエンドポイント

ドキュメントに情報がないので頑張ってコードから探した division: 5d235dc9d281d2d50f6a2193ad2a312ec51d18ca

Path
GET /api/admin/attempts/{id}/userinfo
GET /api/attempts
GET /api/attempts/{id}
GET /api/attempts/{id}/retries
GET /api/attempts/{id}/tasks
PUT /api/attempts
POST /api/attempts/{id}/kill
PUT /api/logs/{attempt_id}/files
GET /api/logs/{attempt_id}/upload_handle
GET /api/logs/{attempt_id}/files
GET /api/logs/{attempt_id}/files/{file_name}
GET /api/project
GET /api/projects
GET /api/projects/{id}
GET /api/projects/{id}/revisions
GET /api/projects/{id}/workflow
GET /api/projects/{id}/workflows/{name}
GET /api/projects/{id}/workflows
GET /api/projects/{id}/schedules
GET /api/projects/{id}/sessions
GET /api/projects/{id}/archive
DELETE /api/projects/{id}
PUT /api/projects
PUT /api/projects/{id}/secrets/{key}
DELETE /api/projects/{id}/secrets/{key}
GET /api/projects/{id}/secrets
GET /api/schedules
GET /api/schedules/{id}
POST /api/schedules/{id}/skip
POST /api/schedules/{id}/backfill
POST /api/schedules/{id}/disable
POST /api/schedules/{id}/enable
GET /api/sessions
GET /api/sessions/{id}
GET /api/sessions/{id}/attempts
GET /api/version
GET /api/version/check
GET /api/workflow
GET /api/workflows
GET /api/workflows/{id}
GET /api/workflows/{id}/truncated_session_time

digdag push

digdag push すきなプロジェクト名 --project digdag該当ディレクトリ

Secretキーへpy>sh>からアクセスする

*.digdag

+python-task:
  _env:
    pg_pw: ${secret:pg.password}
  py>: tasks.main

main.py

import digdag
import os

#digdag変数へのアクセス
digdag.env.params['session_id']

#secretにenv経由でアクセス
pw = os.environ.get('pg_pw')