Я пытаюсь написать 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 ...".
Идеальный скрипт, который я пытаюсь написать, будет делать следующее:
- запустите команду mysqldump, описанную выше.
- перебирает все файлы, соответствующие /tmp/db/*.sql, и для каждого:
- разобрать имена полей и сгенерировать "string", "of", "them", "like", "this"
- в соответствующем файле .txt вставьте строку с именами полей перед первой строкой.
- переименуйте все .txt файлы в .csv и удалите все .sql файлы.
Есть советы? Я буду возиться с этим весь день, пока не пойму.