我正在使用awk在stdout中生成一个csv。 有没有办法直接导入mysql中的内容而不将其放到文件中?
答案 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
语法。