ネットの情報を鵜呑みにして痛い目にあった話

2GB ほどの大きさの SQLite の DB があって、こいつを MySQL に移行することにした。移行に際して、SQLite から CSV 形式でデータを取り出そうとして Google 先生にお伺いを立てたところ、こういうページが見つかった。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1413950789?fr=rcmd_chie_detail

Q.
sqliteのデータファイルをローカルでcsvに一括書き出しするにはどのようなコマンドを使えば良いでしょうか?

そして、

A.
sqliteのクライアント上で
.mode csv <テーブル名>
.dump <テーブル名>
です。

がベストアンサーとして紹介されている。

ふむふむそれでいいのかと、仔細を確認せずに、この通りのコマンドを発行したところ、テキスト形式のデータが画面にどどどどどどどどっと表示され、がんがんスクロールアップしていって、どうにも手がつけられなくなってしまった。
慌てて Ctrl + C で SQLite クライアントを停止させ、難局を脱出することとなった。

なるほど、そのままだと、標準出力にデータが書き出されるのかと気付き、
.output <ファイル名>
を発行した上で、再度、同じ手順でデータをファイルに書き出す。

書き出したデータを MySQL 用のサーバーにコピーし、念のために、head コマンドで頭数行を確認。

あれ?

いきなり BIGIN TRANSACTION とか、CREATE TABLE とかが出来ている。
100行ほど確認してみると、今度は INSERT 文が出来ている。
これは CSV ではない。

ここまできて、ようやく、
.help
でコマンドの意味を確認。
.dump は同じ内容のテーブルを作成するための SQL 文を作成するコマンドだったということが分かった。

Yahoo! 知恵袋、間違ってるじゃん。と言ってもそこは自己責任の世界。
鵜呑みにした自分が悪い。
データが多いのと、PC がそこそこ非力なのとで、実はここまでで一時間以上がかかっていた。

結局、
.output <ファイル名>
.mode csv
SELECT * FROM <テーブル名>
で意図した結果を得ることができた。

大事なことなので繰り返しておく。SQLite でテーブル内容を CSV ファイルに一括書き出しするには SQLite クライアントを起動して
.output <ファイル名>
.mode csv
SELECT * FROM <テーブル名>
だ。

ちなみに、この後、SQLite クライアントを終了するか、.output stdout を発行しないと、書き出した CSV ファイルを削除することができない。SQLite クライアントがファイルを書き込みオープンしたままにしているからだ。

また、SQLite の書き出す CSV にはそれなりのくせがあって、基本的にテキストフィールドは ダブルクオーテーションなどでクオートされることはないのだが、フィールドにスペースが入っていたり、ASCII の範囲を超える文字コードが使われていたりすると、そのフィールドだけがダブルクオーテーションでクオートされることも分かった。

結局、今日は、このデータを MySQL に読み込む時間がなくなってしまった。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック