从stdin导入MySQL

时间:2012-10-19 06:39:21

标签: mysql bash awk

我正在使用awk在stdout中生成一个csv。 有没有办法直接导入mysql中的内容而不将其放到文件中?

5 个答案:

答案 0 :(得分:7)

正如@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

答案 1 :(得分:3)

MySQL支持通过扩展插入获取数据,如下所示:

insert into table (col1, col2, col3) values
(a,b,c),
(d,e,f),
(g,h,i);

因此,您可以修改CSV以包含左边的paren和右边的paren和逗号,并在其前面添加insert into table...并附加分号,然后将其直接传送到MySQL命令行。< / p>

您还可以使用命名管道(Unix构造)将TSV(以制表符分隔,而不是以逗号分隔)管道传输到load data infile,如下所示:

mkfifo /tmp/mysqltsv
cat file.csv | sed -e 's/,/\t/g' > /tmp/mysqltsv
mysql -e "load data infile '/tmp/mysqltsv' into table tblname"

那是伪代码。您需要在一个进程中运行cat,在另一个进程中运行mysql命令。最简单的是使用两个不同的终端。更高级的是cat|sed背景。

答案 2 :(得分:1)

您似乎无法直接从stdin导入CSV。 你必须将它保存到一个文件,以便mysql使用其名称作为表的名称(没有扩展名),你可以使用mysqlimport,如:

mysqlimport -uUSER -pPASS DB FILE

答案 3 :(得分:0)

@xdazz比我快,但我会考虑将结果放到一个文件中。为什么?因为这样,如果出现问题,您可以检查并跟踪问题。如果你遇到间歇性的问题,这并不总是会发生,这将非常有用。当然,为了保留磁盘空间,在导入完成后,我会将它们压缩而不要消耗太多。

答案 4 :(得分:-2)

是的,只需使用烟斗。

$ your_command | mysql -u user -p

对不起,这个答案还不够。你不能将csv直接传递给mysql。 你必须做额外的工作才能使结果成为有效的sql。

或者,您可以考虑使用支持将csv文件加载到数据库的mysql native load data infile语法。