我正在使用awk在stdout中生成CSV。有没有办法直接导入MySQL中的内容而不将其放置为文件?
正如@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
。
mySQL支持通过看起来像这样的扩展插入物来获取数据:
insert into table (col1, col2, col3) values
(a,b,c),
(d,e,f),
(g,h,i);
因此,您可以修改CSV以包括左Paren和右Paren和逗号,并用insert into table...
进行预处理并用半隆附加它,然后您可以直接将其直接输送到MySQL命令行。
您也可以使用名为unix构造的命名管道将tsv(tabepareated,而不是逗号分隔)输送到 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
。
似乎您可以直接从stdin导入CSV。您必须将其保存到文件中,以便MySQL使用其名称作为表的名称(无扩展名),您可以使用MySqlimport如下:
mysqlimport -uUSER -pPASS DB FILE
@xdazz比我快,但我会考虑将结果放在文件中。为什么?因为这样,如果出现问题,您可以检查并跟踪问题。如果您遇到间歇性问题,这将非常有帮助。当然,要保留磁盘空间,导入完成后,我将它们抬起来不要消耗太多。
是的,只需使用管道。
对不起,这个答案还不够。您不能直接将CSV直接输送到MySQL。您必须做额外的工作才能使结果是有效的SQL。
或,您可以考虑使用MySQL本机load data infile
语法,该语法支持将CSV文件加载到数据库中。