我可以使用变量在mysql中指定OUTFILE吗
Posted
技术标签:
【中文标题】我可以使用变量在mysql中指定OUTFILE吗【英文标题】:can I use a variable to specify OUTFILE in mysql 【发布时间】:2022-01-07 15:21:38 【问题描述】:有没有办法做类似下面的事情?这不起作用,但显示了我想要做的事情
SET @OutputPath = '/Users/jo/Documents'
SET @fullOutputPath = CONCAT(@OutputPath,'/','filename.csv')
SET @fullOutputPath2 = CONCAT(@OutputPath,'/','filename2.csv')
SELECT * INTO OUTFILE @fullOutputPath
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName;
SELECT * INTO OUTFILE @fullOutputPath2
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName2;
【问题讨论】:
是的,您可以使用variable
,但只能在stored procedures
中使用dynamic sql
【参考方案1】:
您不能在 mysql CLI 中执行此操作,但通过这种方式它可以工作
mysql -e "SELECT * FROM database.tableName;" -u user -p database > filename.csv
【讨论】:
不幸的是,如果不使用SELECT ... INTO OUTFILE
,您将无法指定字段分隔符,并且尝试从外壳中执行此操作会打开一个全新的蠕虫罐:/
当SELECT ... INTO OUTFILE
和其他返回结果集的SELECT(即CREATE PROCEDURE... BEGIN SELECT 1; SELECT 2 INTO OUTFILE <<dynamicfilename>>; SELECT 3; END
【参考方案2】:
编辑:将数据(例如表格)保存到文件中而不使用变量(仅常量值)
-- folder_path could could be like => c:/users/sami
-- choose the directory/folder already available in system
-- and make sure you have access to write the file there
SELECT * INTO OUTFILE 'folder_path/filename.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName;
现在使用变量
当你必须在sql中使用变量名时,你需要动态sql(仅适用于存储过程,既不适用于简单的sql查询,也不适用于触发器或函数)
SET @OutputPath := 'Users/jo/Documents'; //or any folder_path
SET @fullOutputPath := CONCAT(@OutputPath,'/','filename.csv');
SET @fullOutputPath2 := CONCAT(@OutputPath,'/','filename2.csv');
set @q1 := concat("SELECT * INTO OUTFILE ",@fullOutputPath,
" FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName");
set @q2 := concat("SELECT * INTO OUTFILE ",@fullOutputPath2,
" FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName2");
prepare s1 from @q1;
execute s1;deallocate prepare s1;
prepare s1 from @q2;
execute s1;deallocate prepare s1;
由于您的查询中已经有 '
和 "
,所以我使用 "
连接您的查询并使用 \ 转义您原来的 "
以确保其用作文字字符而不用于串联
刚才讲了variable
在sql中的使用。首先,您应该确保您的查询是否像顶部的示例一样工作(不使用变量)
结论:如果您的上述查询工作正常,那么我告诉的动态 sql 也可以正常工作,因为您在某些存储过程中使用它。
【讨论】:
【参考方案3】:我的卡玛很低,所以我发布了一个答案,应该作为对 Sami 帖子的评论 - 您需要用引号将文件名括起来(注意在 @fullOutputPath 之前和之后添加 '):
set @q1 := concat("SELECT * INTO OUTFILE '",@fullOutputPath,
"' FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName");
【讨论】:
【参考方案4】:如果您想从 bash 中执行此操作,即将 csv 中的 mysql 中的一些数据导出到具有动态名称的文件,它可能更容易且更具可读性,如下所示。
内嵌 bash 变量的 SQL:
where (e.timestamp >= $begin_ts and e.timestamp < $end_ts) order by ed.timestamp ASC ) a
INTO OUTFILE '$export_path' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
以及运行 sql 文件的 bash 脚本。请注意评估 sql 脚本并替换变量的 envsubst 命令。
#!/bin/bash
mysql_db="dbname"
mysql_user="mysqlpass"
mysql_pass="password"
export_path="./data.csv"
begin_ts="1478278490"
current_ts=$(date +%s -u)
sql=`export_path=$export_path begin_ts=$last_ts end_ts=$current_ts envsubst < export.sql`
mysql $mysql_db -u $mysql_user -p$mysql_pass -e"$sql"
【讨论】:
以上是关于我可以使用变量在mysql中指定OUTFILE吗的主要内容,如果未能解决你的问题,请参考以下文章
您可以在 Robot Framework 的命令行调用中指定资源文件吗
如何在 Postman Collection 中指定 JSON 请求正文示例