gpt4 book ai didi

MySQL 将 TSV 导出到 STDOUT,而不是文件

转载 作者:行者123 更新时间:2023-11-29 00:39:05 32 4
gpt4 key购买 nike

我正在尝试这样做:

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,但不完全是。

有什么办法可以做到这一点,还是我在鞭打一匹死马?

最佳答案

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

如果您不能让 MySQL 写入一个管道打开的命令,或者直接写入 stdout 以便您可以使用 shell 传输它的输出,那么有一个使用 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 标志生成类似 CSV 的输出,并且--fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=...,
--fields-escaped-by=...
根据 the manual for mysqldump .将 mysqldump 的输出通过管道传输到 psql

关于MySQL 将 TSV 导出到 STDOUT,而不是文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13066396/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com