mygems

CSVをSQLのINSERT文に変換

CSVを入れれば、どのデータベースでも実行できる.sqlスクリプトに。

  • PostgreSQL・MySQL・SQLite
  • 列の型を自動判定
  • 引用符を正しくエスケープ
  • アップロードなし

1.ファイルを開く

CSVまたはTSV。ここにドラッグするか、ファイルを選択してください。

作った理由

データベースのインポートウィザードはCSVにうるさく、コマンドラインのローダーは、データベースサーバーにないことが多いファイルアクセスを必要とします。単純な.sqlスクリプトなら、クエリが動く場所ならどこでも動きます。ただし、手作業で作ると、引用符で必ずつまずきます。姓の中のアポストロフィが1つあるだけでスクリプト全体が壊れ、MySQLではエスケープされていないバックスラッシュが1つで行が壊れます。このツールは、各データベースが実際に必要とするエスケープを施してスクリプトを書き出します。

できること

  • 各列の型を、そのすべての値から判定して、CREATE TABLE文を書き出します。
  • 行を、指定した行数ごとにまとめた複数行のINSERT文として書き出します。
  • 選んだデータベースに合わせて、MySQLのバックスラッシュも含め、名前を引用符で囲み、値をエスケープします。
  • 空のセルはNULLとして書き出し、先頭にゼロがある列や非常に長い数値の列はテキストのままにします。
  • 全体をトランザクションで囲めるので、途中で失敗してもデータベースは元の状態のままです。

バッチに分ける理由

1行ごとに1つのINSERTでは実行が遅く、100万行を1つのINSERTにすると、ほとんどのサーバーが受け付けられない大きさになります。1文あたり数百行なら高速で、一般的なパケットや文のサイズ制限にも収まります。サーバーがエラーを返す場合は、行数を減らしてください。

よくある質問

どのデータベースに対応していますか?
PostgreSQL、MySQL、MariaDB、SQLiteに対応しています。スクリプトは標準的なSQLなので、標準に沿うほかのデータベース、たとえばSQL ServerでもINSERT文なら、CREATE TABLE文に少し手を加えるだけで通ることが多いです。
列の型はどのように決まりますか?
列のすべての値から決まります。整数だけの列はBIGINT、小数は浮動小数点型、true/falseはBOOLEAN、ISO形式の日付はDATE、それ以外は先頭にゼロのある数値も含めてTEXTになります。実行前に、スクリプト内のCREATE TABLE文を編集することもできます。
本番のデータベースで実行しても安全ですか?
スクリプトは1つのテーブルを作成して、そこにINSERTするだけです。ほかのスクリプトと同様に、先に内容を読んでください。プレビューにはスクリプトの冒頭が表示され、テーブル名は自由に決められます。