awk を使用して stdout で csv を生成しています。その内容をファイルに入れずに mysql に直接インポートする方法はありますか?
5 に答える
@xdazzからの答えが言うように、単に使用してLOAD DATA LOCAL INFILE
ください。無知または怠惰から反対票を投じられたと思います。MySQL のマニュアルをざっと読んでみると、それが完全に実行可能な答えであることがわかります。
2016 年と、ほとんどのユーザーにとって最も関連性の高い MariaDB の場合、次のようにします。
bash
awk '{ /* My script that spits out a CSV */ }' | mysql --local-infile=1 -u user -ppassword mydatabase -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE mytable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';"
明らかに、マニュアルを読んで、LOAD DATA INFILE
特定のケースに合わせて必要に応じてオプションを変更してください。
stdinからCSVを直接インポートできないようです。mysqlがその名前をテーブルの名前(拡張子なし)として使用するようにファイルに保存する必要があります。次のようにmysqlimportを使用できます。
mysqlimport -uUSER -pPASS DB FILE
@xdazzは私よりも速かったですが、結果をファイルに入れることを検討したいと思います。なんで?そうすることで、問題が発生した場合に、問題を確認して追跡することができます。これは、断続的な問題に直面した場合に、常に発生するとは限らない場合に非常に役立ちます。もちろん、ディスク容量を節約するために、インポートが完了したら、消費しすぎないようにZIPで圧縮します。
はい、パイプを使用してください。
$ your_command | mysql -u ユーザー -p
申し訳ありませんが、この回答では不十分です。csv を mysql に直接パイプすることはできません。結果を有効なSQLにするために、追加の作業を行う必要があります。
load data infile
または、データベースへの csv ファイルのロードをサポートするmysql ネイティブ構文の使用を検討することもできます。