2012-10-25 38 views
0

我試圖做到這一點:MySQL的出口TSV到STDOUT,而不是一個文件

mysql -u root old_db -e "SELECT some_fields FROM huge_table INTO OUTFILE ..." \ 
| cat header.sql - trailer.sql \ 
| psql new_db 

其中header.sql包含:

COPY huge_table (some_fields) FROM stdin; 

而且trailer.sql只包含\.到終止流。

我不能爲我的生活弄清楚如何讓MySQL將標籤分隔值轉儲到STDOUT中,以便這個管道可以工作。我試過將/ dev/stdout指定爲路徑,但它聲稱沒有權限。

我試圖做到這一點,儘可能快地從MySQL獲取數據到PostgreSQL。寫入磁盤並回到PostgreSQL的時間太慢了。

我注意到,如果你將查詢變成 MySQL,它幾乎會輸出一個TSV,但不完全。

有沒有辦法做到這一點,還是我鞭打死馬?

回答

1

PostgreSQL的COPY不需要製表符分隔;只需使用\copy tablename from stdin csv

如果你不能讓MySQL寫一個管道打開命令,或者直接到標準輸出,因此您可以通過管道與外殼輸出的,有使用UNIX named pipe一個經典的解決方法:

$ mkfifo copy_fifo 
$ psql dbname '\copy table1 from copy_fifo csv' 

然後在另一終端:

$ mysql -u root old_db -e "SELECT some_fields FROM huge_table INTO OUTFILE copy_fifo FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'" 

替代地嘗試:

$ mysql dbname -B -e "SELECT some_fields FROM huge_table" | psql dbname '\copy table1 from stdin' 

儘管這在NULL的存在下不太可能工作。

另一種選擇是使用mysqldump使用-T標誌和 --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=...按照the manual for mysqldump以產生CSV狀輸出。管mysqldump的輸出爲psql

+1

嗯,我真的希望這個工作,但不幸的是MySQL只是抱怨文件已經存在(它堅持創建一個新文件)。我認爲這不容易解決。該死的你MySQL:P – d11wtq

+0

@ d11wtq該死的......我沒想過去檢查一下。 「INTO OUTFILE」沒有「OVERWRITE」或「APPEND」標誌?或者,您可以讓'INTO'寫入'stdout',然後使用shell將輸出輸出到'psql'中? –

+0

你並不孤單,這個問題。 http://stackoverflow.com/q/5016010/398670 –

相關問題