Возможно ли включать заголовки каким-то образом при использовании MySQL INTO OUTFILE
?
Включить заголовки при использовании SELECT INTO OUTFILE?
Ответ 1
Вам придется жестко закодировать эти заголовки самостоятельно. Что-то вроде:
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
FROM YourTable
INTO OUTFILE '/path/outfile'
Ответ 2
Решение, предоставленное Джо Стеанелли, работает, но составление списка столбцов неудобно, когда задействованы десятки или сотни столбцов. Здесь, как получить список столбцов таблицы my_table в my_schema.
-- override GROUP_CONCAT limit of 1024 characters to avoid a truncated result
set session group_concat_max_len = 1000000;
select GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'"))
from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'my_table'
AND TABLE_SCHEMA = 'my_schema'
order BY ORDINAL_POSITION
Теперь вы можете скопировать и вставить полученную строку в качестве первого оператора в методе Joe.
Ответ 3
Для сложного выбора с ORDER BY я использую следующее:
SELECT * FROM (
SELECT 'Column name #1', 'Column name #2', 'Column name ##'
UNION ALL
(
// complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
)
) resulting_set
INTO OUTFILE '/path/to/file';
Ответ 4
Я просто делаю 2 запроса, сначала получаю вывод запроса (ограничение 1) с именами столбцов (без жесткого кода, без проблем с именами узлов, заказами, именами настраиваемых столбцов и т.д.), а во-вторых, чтобы сделать сам запрос и объединить файлы в один файл CSV:
CSVHEAD=`/usr/bin/mysql $CONNECTION_STRING -e "$QUERY limit 1;"|head -n1|xargs|sed -e "s/ /'\;'/g"`
echo "\'$CSVHEAD\'" > $TMP/head.txt
/usr/bin/mysql $CONNECTION_STRING -e "$QUERY into outfile '${TMP}/data.txt' fields terminated by ';' optionally enclosed by '\"' escaped by '' lines terminated by '\r\n';"
cat $TMP/head.txt $TMP/data.txt > $TMP/data.csv
Ответ 5
Вы можете использовать подготовленный оператор с ответом lucek и динамически экспортировать таблицу с именем столбцов в CSV:
--If your table has too many columns
SET GLOBAL group_concat_max_len = 100000000;
--Prepared statement
SET @SQL = ( select CONCAT('SELECT * INTO OUTFILE \'YOUR_PATH\' FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' ESCAPED BY \'\' LINES TERMINATED BY \'\\n\' FROM (SELECT ', GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'")),' UNION select * from YOUR_TABLE) as tmp') from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE' AND TABLE_SCHEMA = 'YOUR_SCHEMA' order BY ORDINAL_POSITION );
--Execute it
PREPARE stmt FROM @SQL;
EXECUTE stmt;
Спасибо, люцерна.
Ответ 6
Это позволит вам заказать упорядоченные столбцы и/или лимит
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
FROM YourTable order by ColName1 limit 3) a
INTO OUTFILE '/path/outfile';
Ответ 7
Я столкнулся с подобной проблемой при выполнении запроса MySQL для больших таблиц в NodeJS. Подход, который я использовал, чтобы включить заголовки в мой файл CSV, заключается в следующем
-
Используйте OUTFILE-запрос для подготовки файла без заголовков
SELECT * INTO OUTFILE [FILE_NAME] FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' FROM [TABLE_NAME]
-
Получить заголовки столбцов для таблицы, использованной в пункте 1
select GROUP_CONCAT(CONCAT(\"\",COLUMN_NAME,\"\")) as col_names from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = [TABLE_NAME] AND TABLE_SCHEMA = [DATABASE_NAME] ORDER BY ORDINAL_POSITION
-
Добавьте заголовки столбцов к файлу, созданному на шаге 1, с помощью пакета npm prepend-file
Выполнение каждого шага контролировалось с помощью обещаний в NodeJS.
Ответ 8
Это альтернативный чит, если вы знакомы с Python или R, и ваша таблица может вписаться в память.
Импортируйте таблицу SQL в Python или R, а затем экспортируйте из нее как CSV, и вы получите имена столбцов, а также данные.
Здесь, как я это делаю, используя R, требуется библиотека RMySQL:
db <- dbConnect(MySQL(), user='user', password='password', dbname='myschema', host='localhost')
query <- dbSendQuery(db, "select * from mytable")
dataset <- fetch(query, n=-1)
write.csv(dataset, 'mytable_backup.csv')
Это немного обманщик, но я обнаружил, что это было быстрым решением, когда число столбцов было слишком длинным, чтобы использовать метод concat выше. Примечание: R добавит столбец "row.names" в начале CSV, поэтому вам нужно отказаться от него, если вам нужно полагаться на CSV, чтобы воссоздать таблицу.
Ответ 9
Итак, если все столбцы в my_table
являются символьными типами данных, мы можем объединить верхние ответы (Joe, matt и evilguc) вместе, чтобы получить заголовок, добавленный автоматически в один "простой" SQL-запрос, например
select * from (
(select column_name
from information_schema.columns
where table_name = 'my_table'
and table_schema = 'my_schema'
order by ordinal_position)
union all
(select * // potentially complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
from my_table)) as tbl
into outfile '/path/outfile'
fields terminated by ',' optionally enclosed by '"' escaped by '\\'
lines terminated by '\n';
где последние две строки делают вывод csv.
Обратите внимание, что это может быть медленным, если my_table
очень велико.
Ответ 10
Так как функциональность "include-headers" пока еще не встроена, и большинство "решений" здесь нужно вводить имена столбцов вручную и/или даже не принимать во внимание, d рекомендовать обойти проблему.
-
Лучшей альтернативой, которую я нашел до сих пор, является использование достойного инструмента (я использую HeidiSQL).
Поместите свой запрос, выберите сетку, просто щелкните правой кнопкой мыши и экспортируйте в файл. Он получил все необходимые опции для чистого экспорта, а также должен удовлетворить большинство потребностей. -
В той же идее подход user3037511 работает отлично и может быть легко автоматизирован.
Просто запустите свой запрос с помощью командной строки, чтобы получить заголовки. Вы можете получить данные с помощью SELECT INTO OUTFILE... или выполнив свой запрос без ограничения, ваш выбор.Обратите внимание, что перенаправление вывода в файл работает как обаяние как для Linux, так и для Windows.
Это заставляет меня хотеть выделить, что 80% времени, когда я хочу использовать SELECT FROM INFILE или SELECT INTO OUTFILE, я в конечном итоге использую что-то еще из-за некоторых ограничений (здесь отсутствие "параметры заголовков", AWS-RDS, отсутствующие права и т.д.)
Следовательно, я точно не отвечаю на вопрос op... но он должен отвечать на его потребности:)
EDIT: и на самом деле ответить на его вопрос: нет
По состоянию на 2017-09-07 вы просто не можете включать заголовки, если вы придерживаетесь команды SELECT INTO OUTFILE: |
Ответ 11
пример из моей базы данных датчика имени таблицы с столбцами (идентификатор, время, единица измерения)
select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM sensor
Ответ 12
Я думаю, что если вы используете UNION, он будет работать:
select 'header 1', 'header 2', ...
union
select col1, col2, ... from ...
Я не знаю, как напрямую указать заголовки с синтаксисом INTO OUTFILE.
Ответ 13
На самом деле вы можете заставить его работать даже с ORDER BY.
Просто нужно обмануть в инструкции order by - мы используем оператор case и заменяем значение заголовка некоторым другим значением, которое, как гарантируется, будет сортироваться первым в списке (очевидно, это зависит от типа поля и того, сортировка ASC или DESC)
Скажем, у вас есть три поля, имя (varchar), is_active (bool), date_something_happens (дата), и вы хотите отсортировать второй второй по убыванию:
select
'name'
, 'is_active' as is_active
, date_something_happens as 'date_something_happens'
union all
select name, is_active, date_something_happens
from
my_table
order by
(case is_active when 'is_active' then 0 else is_active end) desc
, (case date when 'date' then '9999-12-30' else date end) desc
Ответ 14
Вот способ динамического получения заголовков заголовков из имен столбцов.
/* Change table_name and database_name */
SET @table_name = 'table_name';
SET @table_schema = 'database_name';
SET @default_group_concat_max_len = (SELECT @@group_concat_max_len);
/* Sets Group Concat Max Limit larger for tables with a lot of columns */
SET SESSION group_concat_max_len = 1000000;
SET @col_names = (
SELECT GROUP_CONCAT(QUOTE(`column_name`)) AS columns
FROM information_schema.columns
WHERE table_schema = @table_schema
AND table_name = @table_name);
SET @cols = CONCAT('(SELECT ', @col_names, ')');
SET @query = CONCAT('(SELECT * FROM ', @table_schema, '.', @table_name,
' INTO OUTFILE \'/tmp/your_csv_file.csv\'
FIELDS ENCLOSED BY \'\\\'\' TERMINATED BY \'\t\' ESCAPED BY \'\'
LINES TERMINATED BY \'\n\')');
/* Concatenates column names to query */
SET @sql = CONCAT(@cols, ' UNION ALL ', @query);
/* Resets Group Contact Max Limit back to original value */
SET SESSION group_concat_max_len = @default_group_concat_max_len;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Ответ 15
Я писал свой код на PHP, и у меня была небольшая проблема с использованием функций concat и union, а также не использовались переменные SQL, так как я получил его для работы, вот мой код:
//first I connected to the information_scheme DB
$headercon=mysqli_connect("localhost", "USERNAME", "PASSWORD", "information_schema");
//took the healders out in a string (I could not get the concat function to work, so I wrote a loop for it)
$headers = '';
$sql = "SELECT column_name AS columns FROM `COLUMNS` WHERE table_schema = 'YOUR_DB_NAME' AND table_name = 'YOUR_TABLE_NAME'";
$result = $headercon->query($sql);
while($row = $result->fetch_row())
{
$headers = $headers . "'" . $row[0] . "', ";
}
$headers = substr("$headers", 0, -2);
// connect to the DB of interest
$con=mysqli_connect("localhost", "USERNAME", "PASSWORD", "YOUR_DB_NAME");
// export the results to csv
$sql4 = "SELECT $headers UNION SELECT * FROM YOUR_TABLE_NAME WHERE ... INTO OUTFILE '/output.csv' FIELDS TERMINATED BY ','";
$result4 = $con->query($sql4);
Ответ 16
Я хотел бы добавить к ответу, предоставленному Сангам Белозе. Вот его код:
select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM sensor
Однако, если вы не настроили "secure_file_priv"
внутри переменных, он может не работать. Для этого проверьте папку, установленную для этой переменной:
SHOW VARIABLES LIKE "secure_file_priv"
Вывод должен выглядеть так:
mysql> show variables like "%secure_file_priv%";
+------------------+------------------------------------------------+
| Variable_name | Value |
+------------------+------------------------------------------------+
| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
+------------------+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Вы можете либо изменить эту переменную, либо изменить запрос для вывода файла с указанием пути по умолчанию.
Ответ 17
Одного MySQL недостаточно, чтобы сделать это просто. Ниже приведен скрипт PHP, который будет выводить столбцы и данные в CSV.
Введите имя вашей базы данных и таблицы в верхней части.
<?php
set_time_limit (24192000); ini_set ('memory_limit', '-1'); setlocale (LC_CTYPE, 'en_US.UTF-8'); mb_regex_encoding ('UTF-8');
$ dbn = 'DB_NAME'; $ tbls = array ('TABLE1', 'TABLE2', 'TABLE3');
$ db = новый PDO ('mysql: host = localhost; dbname ='. $ dbn. '; charset = UTF8', 'root', 'pass');
foreach ($ tbls как $ tbl) {эхо $ tbl. "\ П"; $ path = '/var/lib/mysql/'. долл. США '.Csv';
$colStr = '';
$cols = $db->query( 'SELECT COLUMN_NAME AS 'column' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "' . $tbl . '" AND TABLE_SCHEMA = "' . $dbn . '"' )->fetchAll( PDO::FETCH_COLUMN );
foreach( $cols as $col )
{
if( $colStr ) $colStr .= ', ';
$colStr .= '"' . $col . '"';
}
$db->query(
'SELECT *
FROM
(
SELECT ' . $colStr . '
UNION ALL
SELECT * FROM ' . $tbl . '
) AS sub
INTO OUTFILE "' . $path . '"
FIELDS TERMINATED BY ","
ENCLOSED BY "\""
LINES TERMINATED BY "\n"'
);
exec( 'gzip ' . $path );
print_r( $db->errorInfo() );
}
?>
Вам нужно, чтобы это был каталог, в который вы хотите вывести данные. MySQL должен иметь возможность записи в каталог.
$path = '/var/lib/mysql/' . $tbl . '.csv';
Вы можете редактировать параметры экспорта CSV в запросе:
INTO OUTFILE "' . $path . '"
FIELDS TERMINATED BY ","
ENCLOSED BY "\""
LINES TERMINATED BY "\n"'
В конце есть вызов exec для GZip CSV.
Ответ 18
SELECT 'ColName1', 'ColName2', 'ColName3' UNION ALL SELECT ColName1, ColName2, ColName3 FROM YourTable INTO OUTFILE 'c:\\datasheet.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'