Могу ли я использовать переменную, чтобы указать OUTFILE в mysql
Есть ли способ сделать что-то вроде следующего? который не работает, но показывает, что я хочу делать
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;
Ответы
Ответ 1
Изменить: Сохранение данных (например, таблицы) в файл без использования переменной (только постоянные значения)
SELECT * INTO OUTFILE 'Users/sami/Documents/filename.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
FROM database.tableName;
Теперь с использованием переменной
Всякий раз, когда вам нужно использовать имя переменной в sql, вам нужен динамический sql (который применим только в хранимых процедурах, ни в простом sql-запросе, ни в триггерах или функциях)
SET @OutputPath := 'Users/jo/Documents';
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 будет работать так же, как и в том, что вы используете его в некоторой хранимой процедуре.
Ответ 2
Вы не можете сделать это в mysql CLI, но таким образом он работает
mysql -e "SELECT * FROM database.tableName;" -u user -p database > filename.csv
Ответ 3
У меня низкая карма, поэтому я отправляю ответ, который должен идти как комментарий к сообщению Sami - вам нужно заключить имя файла по кавычкам (примечание добавлено "до и после @fullOutputPath):
set @q1 := concat("SELECT * INTO OUTFILE '",@fullOutputPath,
"' FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
FROM database.tableName");
Ответ 4
Если вы хотите сделать это из bash, то есть экспортировать некоторые данные из mysql в csv в файл с динамическим именем, это, возможно, проще и читабельнее, чем следующее.
SQL со встроенными переменными bash:
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';
И bash script, который запускает файл sql. Обратите внимание на команду envsubst, которая вычисляет sql script и заменяет переменные.
#!/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}"