2013年08月27日

[Web] AWSを使ってみる DSQLまわりとかファイルアップロードとか

文字化け問題が解決したことで、やっとアプリづくりに入ることができました。
早速ですが、1万件のレコードをSQLに入れてみよう!


@大量のレコードをRDSのテーブルに挿入する

INSERT INTO ……

を1万行も書けるかー!
とうことで、大量のレコードを簡単にテーブルに挿入する方法を探しました。
SQLの「LOAD DATA INFILE」が早そうです。

=======================================
● 構文
LOAD DATA INFILE "ファイル名" INTO TABLE テーブル名
FIELDS TERMINATED BY ',区切り文字' ENCLOSED BY '"';

● SQL
LOAD DATA LOCAL INFILE '[ファイル名].csv'  ← EC2の ~/ に置いた
REPLACE INTO TABLE [テーブル名]
CHARACTER SET utf8         ← CSVファイルの中身もUTF-8で!
FIELDS TERMINATED BY ','       ← カンマ( , )区切りです
OPTIONALLY ENCLOSED BY '"';     ← 文字をテーブルに保存するときはダブルクォート( " )でお願いします
=======================================

【参考】
大規模CSVをMySQLに入れる
LOAD DATA INFILE構文:データのインポート
[MySQL] CSV を使ってエクスポート・インポート

これを知らず、始めは INSERT文をコンソールにコピペしてましたが、手作業なので遅いし正確性が心配なので
止めてよかったです。

と思ったところで、「さて、どうやってCSVファイルをEC2にアップロードしよう」という新たな疑問が生じました。


AEC2にSSHやFileZillaを使ってファイルをアップロードする

●コンソール画面からファイルをアップする ※SCPコマンドを使用

参考サイトを元に、EC2用に書き変えました↓

$ scp -P 22 -i [証明書] [CSVファイル] ec2-user@xx.xx.xx.xx:/home/ec2-user/
xxxxxxx.csv 100% 65KB 65.3KB/s 00:00   ←これが表示されれば成功

【参考】ssh でファイル転送(SCP コマンド)


FTPソフト「FileZilla」を使うこともできます。

●設定
ホスト:ec2-user@xx.xx.xx.xx の「xx.xx.xx.xx」部分
ポート:空でOK
Protocol:SFTP
ログオンの種類:パスワードを訪ねる
ユーザー:ec2-user ※SSHでログインするときのユーザー
パスワード:空でOK
アカウント:空でOK

参考サイトにもありますが、SSHでログインするときに使っている秘密鍵を使用します。
※そのままでは使用できないため、変換する旨のアラートが表示されるのでOKを押します

メニュー > FileZilla > Preference の画面
スクリーンショット 2013-08-27 8.06.44.png

【参考】【aws】ec2にfilezilla経由でファイルアップロード

これで無事CSVファイルの中身をRDSのテーブルに挿入することができました。


BちょっとしたSQLの話

よく使うSQLをズラズラと。

●テーブル作成
CREATE TABLE [テーブル名] (
[カラム名] [型] [NOT NULL等のオプション],
[インデックス名](インデックスを付与するカラム名),
) DEFAULT CHARSET=utf8; ← 文字コードはUTF-8

●テーブル名変更
ALTER TABLE [旧テーブル名] RENAME TO [新テーブル名];

●カラム追加
ALTER TABLE [テーブル名] ADD [カラム名] [型] [NOT NULL等のオプション];

●カラムの型変更
ALTER TABLE [テーブル名] CHANGE COLUMN [旧カラム名] [新カラム名] [変えたい型] [NOT NULL等のオプション];
※新旧のカラム名は同じ

●インデックス確認
SHOW INDEX FROM [テーブル名];

●複合インデックスの付与 ※条件で組み合わせて使うカラムがあるときに有効
CREATE INDEX [インデックス名] ON [テーブル名]([カラム1], [カラム2]);

●インデックス削除
ALTER TABLE [テーブル名] DROP INDEX [削除したいインデックス];

●SELECT文の結果をテーブルに挿入
INSERT INTO [テーブル名] ([カラム1], [カラム2], ....)
SELECT [カラム1], [カラム2], ...
FROM [テーブル名];

●特定の小数点以下を切り捨て ※123.4567 → 123.45
SELECT TRUNCATE([カラム名], 2) FROM [テーブル名];

【参考】
CREATE TABLE構文
MySQL 編13 - 数値関数、余り、四捨五入、切り捨て、切り上げ、数値書式
SELECT結果をINSERT/UPDATE


準備が整ったので、今度こそアプリづくりに着手できる……はず!
posted by be-style at 08:40| Comment(0) | Web
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。