20210607のdockerに関する記事は10件です。

【ペンディング中 1点】〇〇-PostgreSQL / DBeaver_『OSS-DB標準教科書』4

はじめに 『オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0)Kindle版』を進めています。 同じくこの教科書で学習する人に向けて、また、自分の忘備録として学習でつまずいたことについて、記録を残します。 今回進めた項 ・5.SQLによるデータベースの操作応用編 --5.1 演算子と関数(演算子,関数,GROUP BY句と集約関数の組み合わせ,HAVING句,WHERE句/GROUP BY句/HAVING句の適用順序 --5.2 副問い合わせ(EXISTS演算子,IN演算子) --5.3 日付・時刻型データの取り扱い(日付形式を確認・設定,現在時刻を取得,文字列の入力値を日付型の列に格納) --5.4 複雑な結合(外部結合,クロス結合,自己結合) --5.5 LIMIT句による検索行数制限(LIMITと並び順の指定,OFFSET句) つまずいたこと ・テーブルに存在するデータをLIKE文で呼び出したいが、できない(5.1.1 LIKE演算子) 環境 ホストPC:Windows10 GUI DBツール:DBeaver 仮想化ソフト:VirtualBox ゲストPC:Vagrant(=CentOS7=仮想マシン) コンテナ型仮想環境:Docker CUI DBクライアント:PostgreSQL テーブルに存在するデータをLIKE文で呼び出したいが、できない(5.1.1 LIKE演算子) ↓テーブルはこれ。 SQL文「SELECT * FROM customer WHERE customer_name LIKE '鈴木%';」を用いて 「上記テーブル(customer表) のcustomer_name列が「 鈴木」で始まる行データを取得」しよう、 というお題が出されているのだが、 このSQL文を実行すると、↓このように「データなし」との回答が返ってくる。 本来であれば 「2 鈴木物産」 が返ってくるはずなのに!なぜ返ってこないのだろう?? 仮に「SELECT * FROM customer WHERE customer_id =2;」を実行してみる。 ↓ ちゃんと「2 鈴木物産」が返ってきた。 予想1:スペース過多or不足? →「'鈴木%'」の中のスペースが足りない?→何種類かスペース入れて実行してみたが、結果は変わらず。原因はこれではないようだ。 予想2:これ以上予想できない!とりあえず今は先に進むことを優先させる。ここは標準教科書を全て終えてから復習する!【ペンディング事項-2021/06/07】 明日(6/8)は下記から! 「以下 の 例 では、 customer 表 の customer_ name 列 に「 商」 が 含ま れる 行 データ を 検索 し て い ます。 前後 に% が つい て いる ので、 値 の どこ に「 商」 が あっ ても 検索 条件 に 一致 し ます。 宮原徹; 喜田紘一. オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0) (Kindle の位置No.1452-1453). LPI-Japan. Kindle 版. 」
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker-compose】コンテナ起動時にport is already allocatedエラーが発生したときの対処方法

Laravelのwebアプリを作成するために、Docker-composeで環境構築してコンテナを起動したところMySQLの立ち上げでエラーが発生しました。 自分用の記録としてエラーの解消方法をメモします。 開発環境 docker-compose version'3' MySQL '5.7' やりたいこと Docker-composeで環境構築してLaravelのアプリを作成したい。 ということでdocker-compose.ymlを以下の通り編集して、docker-compose upコマンドを叩いた。 version: '3' services: web: image: nginx:1.15.6 ports: - '8000:80' depends_on: - app volumes: - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html app: build: ./docker/php volumes: - .:/var/www/html depends_on: - mysql mysql: platform: linux/x86_64 image: mysql:5.7 environment: MYSQL_DATABASE: memo_app MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql volumes: mysql-data: エラー内容 Bind for 0.0.0.0:3306 failed: port is already allocated エラー文によると、3306番ポートが既に割り当てられているので、MySQLが起動できずエラーが発生してしまったらしい。 他のアプリでもDocker-composeとMySQLでアプリを作成していたので、そのコンテナが原因か。 対処方法 まずは次のコマンドで現在起動中のコンテナを確認。 ターミナル docker ps 起動中のコンテナの中から、3306番ポートを使用しているコンテナを停止する。 ターミナル docker stop (対象のCONTAINER ID) これで無事にdocker-compose upできました!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでMinecraft Serverを立てる

Dockerはいろんな使い方ができるので、マイクラサーバーとかを立てることもできる。 そういう使い方もされるみたい?なので自分なりにDockerを使ってバニラのマイクラサーバーを立ててみる。 今回はDockerfileの編集手順もまとめていきたい。 目次 Javaの実行環境を入れる マイクラサーバーの入手 ディレクトリの場所を整理 データをマウントしてローカルへ保存する CMDコマンドの設定 環境 Docker version 20.10.6 Ubuntu(ベースイメージ) version latest エディタ:VScode Dockerfileの作成 まず、ubuntuのイメージを起動してコマンドを手打ちして確認作業をしつつ書いていきます。 $ docker run -it ubuntu bash Javaの実行環境を入れる まずはいつものapt関連の更新をしておく。 $ apt update && apt upgrade -y 次にJavaを入れるために $ apt search openjdk-\(\.\)\+-jre$ これを実行してJavaのJRE(実行環境)で有効なバージョン一覧を表示する。 自分のやったタイミングでは11, 13, 14, 16, 8が表示される。 そこで自分も扱ったことの多い8を選択(他のバージョンで何か問題が起きるのが嫌なので)。 $ apt install openjdk-8-jre でインストールする。 と、タイムゾーン選択の処理が入る。 タイムゾーンはtzdataのパッケージを入れて対処をする。 ここまでをDockerfileに書いていく。 FROM ubuntu:latest RUN apt update && apt upgrade -y && apt install -y tzdata ENV TZ Asia/Tokyo RUN apt install -y openjdk-8-jre ここで一旦ビルドして、エラーがでないかを確認しておくのもよき。 $ docker build . $ docker run -it <docker-image-id> マイクラサーバーの入手 マイクラサーバーのクライアントをインターネットから入手する必要がある。 そこで、wgetのパッケージが必要なのでこれをインストールする。 $ apt install wget そしたらバージョン毎にダウンロード可能なArchiveが保存されてるサイトを参照する。 ここ⇦から今回は1.16.5のクライアントをダウンロードします。 Downloadを押して、Download Server Jarのリンクをコピーして、wgetでダウンロードします。 $ wget https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar これでクライアントの準備はできました。 ここまでをDockerfileに書きましょう。 FROM ubuntu:latest RUN apt update && apt upgrade -y && apt install -y tzdata wget ENV TZ Asia/Tokyo RUN apt install -y openjdk-8-jre && \ wget https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar レイヤーをできるだけ減らすため、&&を使って記述していきます。 ディレクトリの場所を整理 ここでディレクトリの整理をします。もうすでに必要最低限のパッケージなどはインストール済みです。 まず、サーバークライアントはoptディレクトリに入れます。通常はソフトウェアなどを入れるフォルダです。 サーバーの主要ファイル群はrootディレクトリに入れます。 なので、ダウンロード場所をoptにして、コマンド実行をrootディレクトリで行うようにします。 FROM ubuntu:latest RUN apt update && apt upgrade -y && apt install -y tzdata wget ENV TZ Asia/Tokyo WORKDIR /opt RUN apt install -y openjdk-8-jre && \ wget https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar WORKDIR /root optに移動して、サーバークライアントをダウンロード後、ルートディレクトリに移動しておきます。 データをマウントしてローカルへ保存する ここはかなり重要な部分です。 コンテナ内にサーバーデータを置いたままだとコンテナを閉じた時にデータが全部なくなってしまいます。 そこで、以下の図のようなディレクトリ構成でマウントを行います。 まず、コンテナ内とローカルPCでマウントするディレクトリは、/mnt/varと、./varです。 その後、/mnt/varのデータを/rootに移動させる。それでサーバークライアントを起動させ、ストップしたら/rootのデータを/mnt/varに移動させる。 これでデータを保存することができます。 これをシェルスクリプトに書いておきます。 mv /mnt/var/* /root java -Xmx1024M -Xms1024M -jar /opt/server.jar mv /root/* /mnt/var ここまでをDockerfileに書きます。 FROM ubuntu:latest RUN apt update && apt upgrade -y && apt install -y tzdata wget ENV TZ Asia/Tokyo WORKDIR /opt RUN apt install -y openjdk-8-jre && \ wget https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar WORKDIR /root RUN echo "mv /mnt/var/* /root" > run.sh && \ echo "java -Xmx1024M -Xms1024M -jar /opt/server.jar" >> run.sh && \ echo "mv /root/* /mnt/var" >> run.sh CMDコマンドの設定 CMDコマンドは、先程のシェルスクリプトを指定します。 これに加えて、CMDで実行するために実行権限を持たせるコマンド、マウント先のディレクトリ作成、eula=ture(これがないとサーバーが起動できない)のファイルを作成、というコマンドを追加して、Dockerfile完成です。 FROM ubuntu:latest RUN apt update && apt upgrade -y && apt install -y tzdata wget ENV TZ Asia/Tokyo WORKDIR /opt RUN apt install -y openjdk-8-jre && \ wget https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar WORKDIR /root RUN echo eula=true > eula.txt && echo "mv /mnt/var/* /root" > run.sh && \ echo "java -Xmx1024M -Xms1024M -jar /opt/server.jar" >> run.sh && \ echo "mv /root/* /mnt/var" >> run.sh && chmod 777 run.sh && mkdir /mnt/var CMD ["sh", "run.sh"] docker-compose.ymlを作成 上のDockerfileをビルドすればできますが、立ち上げるときのマウントやポート指定を楽にするためにymlファイルを作成します。 version: '3' services: mcserver: image: sugimochi/mcserver volumes: - './var:/mnt/var' ports: - '25565:25565' tty: true stdin_open: true まとめ これにて完成です。 一つ一つ確認しながらDockerfileを書いていくという流れをよく理解することができました。 また環境を作ったりするときにこういう練習はしていきたいですね。 参考文献 Linuxディレクトリ構造 OpenJDK(Java)を最新のUbuntuにインストール MCVERSIONS.NET Dockerfile で cd が効かない 【最新版対応】マイクラサーバーの立て方【公式サーバー bat編】 Dockerで複数CMDを実行する方法 Linuxの権限確認と変更(chmod)(超初心者向け) Git Hub https://github.com/sugimochi97/docker_mcserver
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでReact+Typescriptの開発環境を構築する

はじめに よく見る内容ではありますが、メンバーに配布できるようになってなくて困ったことがあってので改めて自分でやってみました。 環境 ~ % docker --version Docker version 20.10.2, build 2291f61 ~ % docker-compose --version docker-compose version 1.27.4, build 40524192 手順 node.jsのイメージをもとにコンテナ作成 Reactのプロジェクト作成 より使いやすく 1.node.jsのイメージをもとにコンテナ作成 node.jsのイメージをもとにコンテナを作成する [ docker-compose.yml ] version: '3' services: app: image: node:16.3.0-alpine3.11 volumes: - .:/app tty: true 動作確認 ~ % docker-compose exec app sh / # node Welcome to Node.js v16.3.0. Type ".help" for more information. > nodeコマンドが使用できることが確認できます / # ls app bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var / # cd app /app # ls docker-compose.yml ファイルがコンテナ内にマウントされていることも確認できました。 2.Reactのプロジェクト作成 先ほど作成したコンテナ内でReactのプロジェクトを作成します。 ~ % docker-compose exec app sh / # cd app /app # npx create-react-app sample_app --template typescript パッケージのインストールが走ってsample_appディレクトリが作られます。 . ├── docker-compose.yml └── sample_app Reactの初期ページを参照するにはポートの設定が必要です。 [ docker-compose.yml ] version: '3' services: app: image: node:16.3.0-alpine3.11 volumes: - .:/app ports: # 追加 - "8080:3000" tty: true yarn startで立ち上がるサーバーのポートは3000がデフォルトなので、それをもとに設定。http://localhost:8080/ でReactの初期ページが参照できます。 3. より使いやすく [ docker-compose.yml ] version: '3' services: app: image: node:16.3.0-alpine3.11 volumes: # ①変更 - ./sample_app:/app ports: - "8080:3000" working_dir: /app # ②追加 command: sh -c "yarn install && yarn start" # ③追加 ① マウントするディレクトリの変更 sample_app内以外のファイルをコンテナ内でいじる必要がないからね。 ② working_dirの変更 コンテナ入った時に一発でsample_app配下のファイルに行ける方が楽だよね。 ③ コマンドの追加 docker立ち上げのタイミングで yarn install && yarn start のコマンドが走るようになる。docker-compose upするだけでサーバーが立ち上がるからコンテナ入って yarn start叩く必要がないので楽。yarn installはメンバーと環境が合わせられるように。 おわりに ここまでご拝読いただきありがとうございました。少しでも役に立ちますように。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker環境を一度取り壊してきれいにする

環境 Amazon Linux 2 削除 docker sudo yum remove docker -y sudo rm -rf /var/lib/docker docker-comopose sudo rm /usr/local/bin/docker-compose 再インストール docker sudo yum -y install docker docker-compose sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose runでstandard_init_linux.go:219 原因と解決

始めに myappディレクトリ(各自アプリ名)を作成し、その配下に Dockerfile docker-compose.yml Gemfile Gemfile.lockを用意してあります。 問題 $ docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker を実行すると、 standard_init_linux.go:219: exec user process caused: exec format error のエラーが出て、新たにアプリが作成できない。 解決 shebangが抜けていたことが原因だと分かった。 新たに、entrypoint.shファイルを作成し、 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" を記述。 再度、 $ docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker を実行し、無事にアプリが作成できた。 参考記事 https://qiita.com/nsy_13/items/9fbc929f173984c30b5d https://teratail.com/questions/170342
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

演習型ITリテラシー学習アプリを作りました。

こんにちは。 私は今までに複数のアプリを作ってきたのですが、使って貰ったのは家族や知人の狭い範囲でした。 今回は、思い切って公開するので、ぜひご一読お願いできればと思います! なにを作ったのか 一言で言うならば、タイトルにもあるように、演習型ITリテラシー学習アプリです。 アプリの構想はProgateを元にしていて、実際にアプリを操作して、事例に触れながらITリテラシーを「楽しく」学んで貰えることを目指しています。 リリースしたばかりなので、レッスンはまだ「フィッシング詐欺」だけなのですが、これからアップデートできればと思います。 なぜ作ったのか 昨今でもないですが、日本はITリテラシーが低いとよく耳にします。 佐川急便やAmazonなどを装ったメールが届くことはいろいろなところで目に、耳にしますが、本物かどうかわからないという人もちらほら見ます。 そういった人に向けて、是非役に立てればいいなと思って開発しました。 私自身もさほど高い方ではない気がしているので、自分の勉強も兼ねています。 アプリの中身 ・アプリランディングページ ・レッスンスライド ・レッスン ・現在動作が不安定で、読み込みに時間が掛かる場合があります。恐縮ですが、気長にお待ちいただけると幸いです。。。 使い方 Lesson1である「フィッシング詐欺」は、会員登録をしなくても受講していただけます。 「まずはここから始めてみましょう」にある、フィッシング詐欺をクリックすると、Lesson1が始まります。 その後は案内に沿って進めていただければ大丈夫です。 会員登録は、通常の登録とGoogleでのログインができます。 退会処理もできますので、不要と思えばページの下部から「退会手続き」を選択し、処理を進めてください。 開発に当たっての詳細 使用技術 ・PHP, Laravel ・Vue.js ・Docker ・AWS 大変だった部分 大変だったのは、認証機能の理解です。 当アプリは、ログインにメール認証を行っています。 Email Verificationを使いましたが、元から用意されてある分見えない部分があって理解に時間がかかりました。 現在のアプリの状態は、ログインしていようがしていまいが、使える機能に違いがないので、メール認証を完了していなくともログインはできる状態です。 今後は、基本的にこの仕組みは変えずに、より詳細な機能を利用する際は、verifiedのミドルウェアを通すようにして、認証して貰ってから機能を使う仕組みにして行こうと思います。 記事をご覧いただいた方へお願い 是非アプリを使っていただいて、感想や修正依頼、アイデアやその他様々なご意見のフィードバックをいただけたら非常に嬉しいです。 その際は、この記事に直接、もしくは以下に送っていただければと思います。 GitHub アプリ公式TwitterのDM よろしくお願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nsenter で Linux namespace に触れる

namespace を一覧化する lsnsで namespace の一覧を見ることができます。コンテナで bash を実行するコンテナを作った状態でlsnsを実行した結果が以下です。複数の TYPE の namespace ができていることがわかります。 # lsns -o NS,TYPE,PATH,NPROCS,PID,PPID,COMMAND,UID,USER NS TYPE PATH NPROCS PID PPID COMMAND UID USER 4026531835 cgroup /proc/1/ns/cgroup 126 1 0 /sbin/init 0 root 4026531836 pid /proc/1/ns/pid 124 1 0 /sbin/init 0 root 4026531837 user /proc/1/ns/user 126 1 0 /sbin/init 0 root 4026531838 uts /proc/1/ns/uts 124 1 0 /sbin/init 0 root 4026531839 ipc /proc/1/ns/ipc 124 1 0 /sbin/init 0 root 4026531840 mnt /proc/1/ns/mnt 120 1 0 /sbin/init 0 root 4026531861 mnt /proc/19/ns/mnt 1 19 2 kdevtmpfs 0 root 4026531993 net /proc/1/ns/net 124 1 0 /sbin/init 0 root 4026532157 mnt /proc/446/ns/mnt 1 446 1 /lib/systemd/systemd-udevd 0 root 4026532167 mnt /proc/490/ns/mnt 1 490 1 /lib/systemd/systemd-networkd 100 systemd-network 4026532168 mnt /proc/518/ns/mnt 1 518 1 /lib/systemd/systemd-resolved 101 systemd-resolve 4026532193 mnt /proc/27142/ns/mnt 2 27142 27104 bash 0 root 4026532194 uts /proc/27142/ns/uts 2 27142 27104 bash 0 root 4026532195 ipc /proc/27142/ns/ipc 2 27142 27104 bash 0 root 4026532196 pid /proc/27142/ns/pid 2 27142 27104 bash 0 root 4026532198 net /proc/27142/ns/net 2 27142 27104 bash 0 root コンテナ内で動いているプロセスの PID(この例では、27142) がlsnsと一致していることがわかります。 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef0425afad12 nicolaka/netshoot "bash" 54 minutes ago Up 54 minutes vigilant_hopper # docker inspect --format {{.State.Pid}} ef0425afad12 27142 namespace に入る nsenterコマンドを使うと namespace の中に入ってコマンドを実行することができて便利です。例えば、コンテナ内には netstat コマンドが入っていないけれど、実行したい時は以下のように、--target PIDで対象プロセスを指定します。network namespace に入る場合は、--net指定します。 # nsenter --target 27142 --net netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 172.17.0.2:53400 172.217.175.238:80 TIME_WAIT --mountを指定すると mount namespace になります。--allで全てのタイプの namespace に入ります。 # nsenter --target 27142 --all cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.13.2 PRETTY_NAME="Alpine Linux v3.13" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://bugs.alpinelinux.org/" ネットワークの階層モデルと namespace namespace の影響受けるもの netstatコマンドは namespace によって見える範囲が変わります。例えば、コンテナ内から curl http://google.com/ を実行した直後の状態です。 # nsenter --target 27142 --all netstat -ant | grep 80 tcp 0 0 172.17.0.2:34148 216.58.197.206:80 TIME_WAIT # netstat -ant | grep 80 # 何も表示されない arpコマンドも同様です。 # nsenter --target 27142 --all arp ? (172.17.0.1) at 02:42:b0:b9:9b:50 [ether] on eth0 # arp Address HWtype HWaddress Flags Mask Iface 172.17.0.2 ether 02:42:ac:11:00:02 C docker0 10.0.2.3 ether 52:54:00:12:35:03 C eth0 _gateway ether 52:54:00:12:35:02 C eth0 namespace の影響受けないもの 一方、tcpdump コマンドは namespace の影響受けません。コンテナ内から curl http://google.com/ を実行した時の結果です。tcpdumpはより低レイヤー(データリンク層 L2)の情報を取得するからのようです。 # コンテナ内部で tcpdump を実行した結果 13:19:41.076077 IP a8c89c57d8ef.40442 > nrt12s36-in-f14.1e100.net.80: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1 # コンテナ外部で tcpdump を実行した結果 13:19:41.076207 IP vagrant.40442 > nrt12s36-in-f14.1e100.net.http: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1 コンテナ外部で iptraf-ng を使うと、コンテナ内から張った TCP コネクションを一覧化することが出来て便利です。 参考 https://qiita.com/minamijoyo/items/9dd59109e9fe1a35f888 https://github.com/nicolaka/netshoot
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

csvファイルをデータベースに取り込む方法-PostgreSQL / DBeaver_『OSS-DB標準教科書』3

はじめに 『オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0)Kindle版』を進めています。 同じくこの教科書で学習する人に向けて、また、自分の忘備録として学習記録を残します。 今回は下記を進めました。 ・2.データ型 →6/3済 --2.1 数値データ型(integer型,numeric型,その他) --2.2 文字列データ型(character vaying型(varchar型),character型(char型),text型) --2.3 日付・時刻データ型 ・3.表  →6/4済 --3.1表の作成(CREATE TABLE) --3.2表定義の修正(ALTER TABLE) --3.3表の削除(DROP TABLE,DELETE,TRUNCATE) --3.4行データのセーブ・ロード ・4.演習  --4.1演習1:データ操作 →6/5済 --4.2演習2:郵便番号データベース →作業中 つまずいたこと ・csvファイルをデータベースに取り込む方法がわからない!(4.2演習2:郵便番号データベース) 環境 ホストPC:Windows10 GUI DBツール:DBeaver 仮想化ソフト:VirtualBox ゲストPC:Vagrant(=CentOS7=仮想マシン) コンテナ型仮想環境:Docker CUI DBクライアント:PostgreSQL 前回までの内容と今回の内容 ≪前回までの内容≫ ・『OSS-DB標準教科書』1_PostgreSQL実習環境の準備 ・『OSS-DB標準教科書』2_SQLによるDBの操作 基礎 3章-4 行データのセーブ・ロード がわからない この項、何度か読んでみても頭の中がこんがらがるばかりで、 何を言っているのかすぐに理解することができませんでした。 とりあえず把握できたのは次のことがら。 ・セーブとは? →保存すること。 ・ロードとは? →読み込むこと。 ・COPY文を使用すると、行データをファイルにセーブしたり、ファイルからロードすることができる。 ・FORMAT句でcsvを指定することで、CSV形式のファイルをセーブ、ロードができる。 ←COPY文は「行データをファイルからロードできる」とあった。こちらのFORMAT句は「csv形式のファイルをロードできる」とある。 ←4.2の演習では日本郵政のサイトから郵便番号CSVデータをPCのHDDにダウンロードして、そのCSVデータをPostgreSQL(DBeaverで操作中)に「ロード」するという流れだよね。つまり、このFORMAT句を使ってロードするのかな?と予想。 ←いやいや、「3.4.2 CSVファイルのロード」の項で「COPY FROM文でファイルから行データをロードできます」「以下の例は、customer表のデータをCSV形式のファイルからロードしています(COPY FROM文の提示)」とある。COPY文でもCSVファイルをロード可能みたい。 COPY文とFORMAT句の違いって何?? そもそも行データって何??? ・COPY文とFORMAT句の違いは? →COPY文の中でFORMAT句を使うってことかな?COPY文の中でFORMAT句を使ってcsvを指定することで、CSV形式のファイルをロードできるよってことかな。 ・行データとは? →回答を見つけられず。普通に行のデータ?標準教科書の上記のような説明ではどういう意味で使われているんだろう?CSVデータと同義で使われているのだ、と予想。 ・CSVとは? --Comma Separated Valueの略で、Comma(カンマ)で Separated (区切った)Value(値)。「カンマで値を区切ったもの」が入っているファイルで、カンマ区切りファイルともいう。 --ファイルの拡張子は .csv。 --文字や記号で構成されているテキストファイルであり、そのままクリックしてメモ帳で開くことができる。 --互換性が高い。 ・COPYはDBサーバー上のファイルに直接データを書き出す操作で、PostgreSQLのスーパーユーザーでのみ実行することができる。 ←DBeaverで操作している今の状態は、「スーパーユーザーで実行してる状態」なのだろうか? ※OSS-DB公式ページにも解説があったのでここにメモしておく。 [ 第7回 テキストファイル(CSVなど)の入出力 ] 4章-2 の演習で同じ内容の演習があったので、そちらの演習を通して内容を理解していくことにしました。 郵便番号CSVデータを使って演習 標準教科書 [ 4.2演習2:郵便番号データベース ]に従って進めます。 ①郵便番号CSVデータをDL 日本郵政のHPから郵便番号CSVデータをPCのHDDにダウンロード。 (以下はDBeaverの操作) ②CREATE TABLE zipで表作成 CREATE TABLE zip(表定義を教科書どおりにズラっと)で表作成 ③文字コードを確認 標準教科書には 「ダウンロードできるCSVデータは、日本語部分がシフトJISで作成さ れています。一方、 現在使用しているデータベースは日本語をUTF-8 で格納するようにしているため、文字コードをUTF-8に揃える必要があります。」 とありました。 標準教科書ではコマンドでデータベースを作成していますが、 私はDBeaverを使って作成しています。 私のデータベースの文字コードは何なのか?を、まず確認してみます。 →こちらのページのSQL DBeaver --PostgreSQLのDBの文字コードを確認 SELECT character_set_name FROM information_schema.character_sets; をDBeaverで実行したら、「UTF8」と返ってきました! 標準教科書と同じ状況ということですね。 では、CSVデータの文字コードをシフトJISからUTF-8に変更します。 ④CSVデータの文字コードをシフトJISからUTF-8に変更 シフトJISのデータをUTF-8に変換するには、psqlで\encodingメタコマンドを使用する方法と、Linuxのコマンドで文字コード変換をする方法があります。 【psqlメタコマンドを使用する方法】 \encodingメタコマンドを使用すると、psqlが扱うデータの文字コードを変更できます。以下の例は、\ encodingメタコマンドでpsqlが扱うデータの文字コードをシフトJISに変更しています。データベースはUTF-8 で格納するので、シフトJISからUTF-8への文字コード変換が行われます。 ossdb =# \encoding SJIS ossdb =# \copy zip from KEN_ ALL. CSV with csv ossdb =# \encoding UTF-8 (引用元:宮原徹; 喜田紘一. オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0) (Kindle の位置No.1359-1367). LPI-Japan. Kindle 版.) 上記3行のコマンドはSQLではないですよね・・・、DBeaverにそのまま入力して実行可能なのでしょうか? とりあえずやってみます。 →3行について、1行ずつ実行してみました。が、全てエラー。syntax error。 DBeaverではなく、PowerShellでコマンド実行してみます。 「KEN_ALL.CSV: No such file or directory」と出てしまいました。 あれかな、郵便番号のzipファイルがどこにあるかがわかっていないみたい。 今PCにあるCSVファイルのファイル名は小文字だから、コマンド内のファイル名も小文字にしてみる。 同じエラーが出ました。大文字/小文字の問題じゃないみたい。 次は・・・CSVファイルをfirst_tutorialと同じディレクトリに移動させてみよう! と思ったのですが、DBeaverが入っているディレクトリは 「C:\ProgramData\Microsoft\Windows\Start Menu\Programs\DBeaver Community」 で、その中のディレクトリに進むことは、PCのコントロールパネル(?)ではできませんでした。 ならば、GUIであるDBeaver上で「データインポート」みたいなボタンがあるのではないか?と予想し、 探してみました。 すると、それらしきものが見つかりました! 赤枠を適当に入力して「次へ」 「Add Table」→「zip」を選択→「OK」→「次へ」 ↓あれ?なんだか思っていたのと違う結果になってしまいました。予想では、ここで「インポートするファイルの選択」みたいな画面になって、PCのHDDから「ken_all.csv」ファイルを選択することができる、と思っていたのだけれど、そうはなりませんでした。「キャンセル」をクリックして取りやめました。 他に何かそれらしいボタンは無いかと探すと・・・ ありました!「ファイル」の中に「インポート」とあります。 「一般」→「ファイル・システム」→「次へ」 「参照」→csvファイルがあるディレクトリへ行く ここでcsvファイルがあるディレクトリへ行ったのですが、空の状態でした。 zip形式なのがダメなのかな?とファイルを展開すると、無事参照の中に表示されました。 選択して、次にインポート先のフォルダの欄で「参照」をクリックします。 選択できるフォルダは「Scripts」一択だったので、よくわかりませんがとにかくこれを選択し、「OK」。 インポートするファイルのチェックボックスをクリックし、「終了」。 さあ、これでインポートできたのでしょうか? 改めて、PowerShellで # \encoding SJIS # \copy zip from KEN_ ALL. CSV with csv # \encoding UTF-8 を実行してみます。 以前と同じく2行目の時点でエラーになってしまいました。 「インポート先のフォルダ」の指定がまずかったのではないか、と思うのですが、 参照先の候補には、今回選択した「General/Scripts」フォルダのみが表示されていました。 本来はここに「first_tutorial」が候補として表示されるかと思っていたのですが、表示されませんでした。 どうすればcsvファイルを取り込めるのでしょうか? 何につまずいているのか整理 一度、自分が何につまずいているのか整理してみます。 今取り組んでいるのは、『OSS-DB標準教科書』の「4.2演習2:郵便番号データベース」。 この演習の中で、 1)日本郵便のHPから郵便番号のcsvファイルをDLして、 2)その文字コードをシフトJISからUTF-8に変換して 3)データベースに取り込む という作業がある。 文字コードの変換と、データベースへのCSVデータ取り込みができずに苦戦しています。 教科書には # \encoding SJIS # \copy zip from KEN_ ALL. CSV with csv # \encoding UTF-8 を実行せよ、書いてありました。 が、「# \copy zip from KEN_ ALL. CSV with csv」がうまくいきません。 DBeaver上で「ファイルインポート」のような機能が無いか探し、 この記事に書いてきたような試行錯誤をしましたが、解決方法がわからなく、つまずいています。 ①Qiitaの最後に試した「ファイル>インポート」の機能を使って、PCのHDDにあるcsvファイルをDBeaverに読み込ませることは、可能なのでしょうか? ②「インポート先のフォルダを選択します」で「General>Scripts」を指定したのですが(これしか選択肢として表示されなかった)、この指定を「first_turorial>zip」にすれば読込みができると思うのですが、この考えは合っているのでしょうか? ③「first_turorial>zip」を選択肢として表示させる方法があるのでしょうか?   ④そもそも、ここで立ち止まらずに、読込みは現時点ではできない状態で置いておいて、次の項に進むべきでしょうか?それとも、やはりここでしっかりできるようになるべきでしょうか? 続きはまた明日!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【作業中】csvファイルをデータベースに取り込む方法-PostgreSQL / DBeaver_『OSS-DB標準教科書』3

はじめに 『オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0)Kindle版』を進めています。 同じくこの教科書で学習する人に向けて、また、自分の忘備録として学習記録を残します。 今回は下記を進めました。 ・2.データ型 →6/3済 --2.1 数値データ型(integer型,numeric型,その他) --2.2 文字列データ型(character vaying型(varchar型),character型(char型),text型) --2.3 日付・時刻データ型 ・3.表  →6/4済 --3.1表の作成(CREATE TABLE) --3.2表定義の修正(ALTER TABLE) --3.3表の削除(DROP TABLE,DELETE,TRUNCATE) --3.4行データのセーブ・ロード ・4.演習  --4.1演習1:データ操作 →6/5済 --4.2演習2:郵便番号データベース →作業中 つまずいたこと ・csvファイルをデータベースに取り込む方法がわからない!(4.2演習2:郵便番号データベース) 環境 ホストPC:Windows10 GUI DBツール:DBeaver 仮想化ソフト:VirtualBox ゲストPC:Vagrant(=CentOS7=仮想マシン) コンテナ型仮想環境:Docker CUI DBクライアント:PostgreSQL 前回までの内容と今回の内容 ≪前回までの内容≫ ・『OSS-DB標準教科書』1_PostgreSQL実習環境の準備 ・『OSS-DB標準教科書』2_SQLによるDBの操作 基礎 3章-4 行データのセーブ・ロード がわからない この項、何度か読んでみても頭の中がこんがらがるばかりで、 何を言っているのかすぐに理解することができませんでした。 とりあえず把握できたのは次のことがら。 ・セーブとは? →保存すること。 ・ロードとは? →読み込むこと。 ・COPY文を使用すると、行データをファイルにセーブしたり、ファイルからロードすることができる。 ・FORMAT句でcsvを指定することで、CSV形式のファイルをセーブ、ロードができる。 ←COPY文は「行データをファイルからロードできる」とあった。こちらのFORMAT句は「csv形式のファイルをロードできる」とある。 ←4.2の演習では日本郵政のサイトから郵便番号CSVデータをPCのHDDにダウンロードして、そのCSVデータをPostgreSQL(DBeaverで操作中)に「ロード」するという流れだよね。つまり、このFORMAT句を使ってロードするのかな?と予想。 ←いやいや、「3.4.2 CSVファイルのロード」の項で「COPY FROM文でファイルから行データをロードできます」「以下の例は、customer表のデータをCSV形式のファイルからロードしています(COPY FROM文の提示)」とある。COPY文でもCSVファイルをロード可能みたい。 COPY文とFORMAT句の違いって何?? そもそも行データって何??? ・COPY文とFORMAT句の違いは? →COPY文の中でFORMAT句を使うってことかな?COPY文の中でFORMAT句を使ってcsvを指定することで、CSV形式のファイルをロードできるよってことかな。 ・行データとは? →回答を見つけられず。普通に行のデータ?標準教科書の上記のような説明ではどういう意味で使われているんだろう?CSVデータと同義で使われているのだ、と予想。 ・CSVとは? --Comma Separated Valueの略で、Comma(カンマ)で Separated (区切った)Value(値)。「カンマで値を区切ったもの」が入っているファイルで、カンマ区切りファイルともいう。 --ファイルの拡張子は .csv。 --文字や記号で構成されているテキストファイルであり、そのままクリックしてメモ帳で開くことができる。 --互換性が高い。 ・COPYはDBサーバー上のファイルに直接データを書き出す操作で、PostgreSQLのスーパーユーザーでのみ実行することができる。 ←DBeaverで操作している今の状態は、「スーパーユーザーで実行してる状態」なのだろうか? ※OSS-DB公式ページにも解説があったのでここにメモしておく。 [ 第7回 テキストファイル(CSVなど)の入出力 ] 4章-2 の演習で同じ内容の演習があったので、そちらの演習を通して内容を理解していくことにしました。 郵便番号CSVデータを使って演習 標準教科書 [ 4.2演習2:郵便番号データベース ]に従って進めます。 ①郵便番号CSVデータをDL 日本郵政のHPから郵便番号CSVデータをPCのHDDにダウンロード。 (以下はDBeaverの操作) ②CREATE TABLE zipで表作成 CREATE TABLE zip(表定義を教科書どおりにズラっと)で表作成 ③文字コードを確認 標準教科書には 「ダウンロードできるCSVデータは、日本語部分がシフトJISで作成さ れています。一方、 現在使用しているデータベースは日本語をUTF-8 で格納するようにしているため、文字コードをUTF-8に揃える必要があります。」 とありました。 標準教科書ではコマンドでデータベースを作成していますが、 私はDBeaverを使って作成しています。 私のデータベースの文字コードは何なのか?を、まず確認してみます。 →こちらのページのSQL DBeaver --PostgreSQLのDBの文字コードを確認 SELECT character_set_name FROM information_schema.character_sets; をDBeaverで実行したら、「UTF8」と返ってきました! 標準教科書と同じ状況ということですね。 では、CSVデータの文字コードをシフトJISからUTF-8に変更します。 ④CSVデータの文字コードをシフトJISからUTF-8に変更 シフトJISのデータをUTF-8に変換するには、psqlで\encodingメタコマンドを使用する方法と、Linuxのコマンドで文字コード変換をする方法があります。 【psqlメタコマンドを使用する方法】 \encodingメタコマンドを使用すると、psqlが扱うデータの文字コードを変更できます。以下の例は、\ encodingメタコマンドでpsqlが扱うデータの文字コードをシフトJISに変更しています。データベースはUTF-8 で格納するので、シフトJISからUTF-8への文字コード変換が行われます。 ossdb =# \encoding SJIS ossdb =# \copy zip from KEN_ ALL. CSV with csv ossdb =# \encoding UTF-8 (引用元:宮原徹; 喜田紘一. オープンソースデータベース標準教科書 -PostgreSQL-(Ver.2.0.0) (Kindle の位置No.1359-1367). LPI-Japan. Kindle 版.) 上記3行のコマンドはSQLではないですよね・・・、DBeaverにそのまま入力して実行可能なのでしょうか? とりあえずやってみます。 →3行について、1行ずつ実行してみました。が、全てエラー。syntax error。 DBeaverではなく、PowerShellでコマンド実行してみます。 「KEN_ALL.CSV: No such file or directory」と出てしまいました。 あれかな、郵便番号のzipファイルがどこにあるかがわかっていないみたい。 今PCにあるCSVファイルのファイル名は小文字だから、コマンド内のファイル名も小文字にしてみる。 同じエラーが出ました。大文字/小文字の問題じゃないみたい。 次は・・・CSVファイルをfirst_tutorialと同じディレクトリに移動させてみよう! と思ったのですが、DBeaverが入っているディレクトリは 「C:\ProgramData\Microsoft\Windows\Start Menu\Programs\DBeaver Community」 で、その中のディレクトリに進むことは、PCのコントロールパネル(?)ではできませんでした。 ならば、GUIであるDBeaver上で「データインポート」みたいなボタンがあるのではないか?と予想し、 探してみました。 すると、それらしきものが見つかりました! 赤枠を適当に入力して「次へ」 「Add Table」→「zip」を選択→「OK」→「次へ」 ↓あれ?なんだか思っていたのと違う結果になってしまいました。予想では、ここで「インポートするファイルの選択」みたいな画面になって、PCのHDDから「ken_all.csv」ファイルを選択することができる、と思っていたのだけれど、そうはなりませんでした。「キャンセル」をクリックして取りやめました。 他に何かそれらしいボタンは無いかと探すと・・・ ありました!「ファイル」の中に「インポート」とあります。 「一般」→「ファイル・システム」→「次へ」 「参照」→csvファイルがあるディレクトリへ行く ここでcsvファイルがあるディレクトリへ行ったのですが、空の状態でした。 zip形式なのがダメなのかな?とファイルを展開すると、無事参照の中に表示されました。 選択して、次にインポート先のフォルダの欄で「参照」をクリックします。 選択できるフォルダは「Scripts」一択だったので、よくわかりませんがとにかくこれを選択し、「OK」。 インポートするファイルのチェックボックスをクリックし、「終了」。 さあ、これでインポートできたのでしょうか? 改めて、PowerShellで # \encoding SJIS # \copy zip from KEN_ ALL. CSV with csv # \encoding UTF-8 を実行してみます。 以前と同じく2行目の時点でエラーになってしまいました。 「インポート先のフォルダ」の指定がまずかったのではないか、と思うのですが、 参照先の候補には、今回選択した「General/Scripts」フォルダのみが表示されていました。 本来はここに「first_tutorial」が候補として表示されるかと思っていたのですが、表示されませんでした。 どうすればcsvファイルを取り込めるのでしょうか? 何につまずいているのか整理 一度、自分が何につまずいているのか整理してみます。 今取り組んでいるのは、『OSS-DB標準教科書』の「4.2演習2:郵便番号データベース」。 この演習の中で、 1)日本郵便のHPから郵便番号のcsvファイルをDLして、 2)その文字コードをシフトJISからUTF-8に変換して 3)データベースに取り込む という作業がある。 文字コードの変換と、データベースへのCSVデータ取り込みができずに苦戦しています。 教科書には # \encoding SJIS # \copy zip from KEN_ ALL. CSV with csv # \encoding UTF-8 を実行せよ、書いてありました。 が、「# \copy zip from KEN_ ALL. CSV with csv」がうまくいきません。 DBeaver上で「ファイルインポート」のような機能が無いか探し、 この記事に書いてきたような試行錯誤をしましたが、解決方法がわからなく、つまずいています。 ①Qiitaの最後に試した「ファイル>インポート」の機能を使って、PCのHDDにあるcsvファイルをDBeaverに読み込ませることは、可能なのでしょうか? ②「インポート先のフォルダを選択します」で「General>Scripts」を指定したのですが(これしか選択肢として表示されなかった)、この指定を「first_turorial>zip」にすれば読込みができると思うのですが、この考えは合っているのでしょうか? ③「first_turorial>zip」を選択肢として表示させる方法があるのでしょうか?   ④そもそも、ここで立ち止まらずに、読込みは現時点ではできない状態で置いておいて、次の項に進むべきでしょうか?それとも、やはりここでしっかりできるようになるべきでしょうか? 続きはまた明日!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む