Анализ выходных данных mysqldump для создания файлов CSV с заголовками имен полей - PullRequest
1 голос
/ 01 мая 2011

Я пытаюсь написать bash-скрипт, который, учитывая имя локальной базы данных MySQL, экспортирует данные из всех ее таблиц в CSV-файлы со строкой заголовка, содержащей имена полей. Например, если в базе данных есть таблицы customers, orders и inventory, я хочу выгрузить три файла customers.csv, orders.csv и inventory.csv, включая имена полей в заголовках каждого файла.

Работая с mysqldump, мне удалось создать все нужные мне файлы .csv, но без строки заголовка имени поля. Команда также создает набор SQL-файлов, содержащих только структуру таблицы, в командах SQL. После долгих поисков я не могу найти никого, кто смог бы решить эту проблему, не «изобретая велосипед» и не написав собственный сценарий дампа MySQL. mysqldump великолепен, ему просто не хватает этой маленькой функции. И все имена полей, которые мне нужны, прямо в этих файлах SQL, нужно просто разобрать их и добавить строку имен полей для каждого файла CSV, верно?

Моя проблема: я новичок в сценариях оболочки и не знаю, как это сделать.

Вот команда mysqldump, которую я сейчас использую:

mysqldump --host=localhost --user=myusername --password=mypassword \
          --tab=/tmp/db/ --verbose mydatabase \
          --fields-enclosed-by=\" --fields-terminated-by=,

допустим, в базе данных mydatabase есть таблицы customers orders и inventory. Эта команда создаст шесть файлов в каталоге / tmp / db: customers.sql, customers.txt, orders.sql, orders.txt, inventory.sql, inventory.txt. (TXT-файлы являются CSV-файлами, мой скрипт позже изменяет расширение файла на .csv)

.sql файлы выглядят так (на примере клиентов):

-- MySQL dump 10.13  Distrib 5.1.54, for debian-linux-gnu (i686)
--
-- Host: localhost    Database: mydatabase
-- ------------------------------------------------------
-- Server version       5.1.54-1ubuntu4

/* (i removed some generated comments here) */;

--
-- Table structure for table `customers`
--

DROP TABLE IF EXISTS `customers`;
/* (i removed some generated comments here) */;
CREATE TABLE `customers` (
  `customer_id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(256) NOT NULL,
  `last_name` varchar(256) NOT NULL,
  `email` varchar(256) NOT NULL,
  `phone` varchar(20) NOT NULL,
  `notes` longtext NOT NULL,
  PRIMARY KEY (`customer_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1865 DEFAULT CHARSET=latin1;

/* (i removed some generated comments here) */;
-- Dump completed on 2011-05-01 13:03:02

и файлы .txt выглядят так, как вы ожидаете, что CSV будет выглядеть (строки «data», «like», «this»), но без заголовков имен полей.

Как видите, имена полей, которые мне нужны, находятся прямо в файлах .sql после "CREATE TABLE ...".

Идеальный скрипт, который я пытаюсь написать, будет делать следующее:

  1. запустите команду mysqldump, описанную выше.
  2. перебирает все файлы, соответствующие /tmp/db/*.sql, и для каждого:
    1. разобрать имена полей и сгенерировать "string", "of", "them", "like", "this"
    2. в соответствующем файле .txt вставьте строку с именами полей перед первой строкой.
  3. переименуйте все .txt файлы в .csv и удалите все .sql файлы.

Есть советы? Я буду возиться с этим весь день, пока не пойму.

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

Я сделал простой тест под Windows.

create database if not exists test;

use test;

create table csv_header(
id int not null auto_increment primary key,
fname varchar(50),
lname varchar(50),
dob date)
engine = myisam;

insert into csv_header (fname,lname,dob) values 
('nick','smith','2000-12-05'),
('john','white','1990-12-05');

set @str = (select concat("select * from (select ", group_concat(concat("'",column_name,"'"))," union
            select * from ", table_name, ") as t into outfile 'd:/",table_name,".txt'
        fields terminated by ',' 
        lines terminated by '\r\n'")
            from information_schema.columns
            where table_schema = 'test' and table_name = 'csv_header'
            order by ordinal_position);

-- select @str;

prepare stmt from @str;
execute stmt;
deallocate prepare stmt;

И это содержимое моего csv_header.txt:

id,fname,lname,dob
1,nick,smith,2000-12-05
2,john,white,1990-12-05 

Если это то, что вы ищете,просто создать хранимую процедуру с курсором, который зацикливает все таблицы в схеме и делает то же самое для каждой из них.Дай мне знать.:)

0 голосов
/ 30 апреля 2013
set group_concat_max_len = 5000;

set @qry = (select concat("select ",group_concat(CONCAT('''', column_name, '''' ) ), " UNION SELECT * FROM " ,table_name,  ' INTO OUTFILE ', " '/tmp/test.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'  ESCAPED BY '\"' LINES TERMINATED BY '\\n' " ) from information_schema.columns where table_schema = database() and table_name = 'spree_users');

prepare stmt from @qry;
execute stmt;
deallocate prepare stmt;
0 голосов
/ 15 августа 2012

Я не мог найти способ сделать это, учитывая, что:

  • мой сервер БД - это удаленный компьютер с
  • нет NFS
  • ни возможность писать в общий ресурс на моем локальном компьютере.

Я сделал стандартный дамп SQL и grep'd файл в формате CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...