@Untiwe

Как получить всю БД в виде csv?

Есть какая то БД с набором таблиц, например:
id instrument
1 gitar
2 piano

id name instrument_id
1 Вася 1
2 Петя 1
3 Сережа 2

Мне надо сделать из нее csv файл, здесь он будет примерно такой

Name instrument
Вася,gitar
Петя,gitar
Сережа,piano

А а теперь интересное:
-СУБД несколько и они разных видов (oracl, mongo, mysql и т.д.)
-Я не знаю их архитектуру и название таблиц заранее
-Если есть связь Many to Many, значит будет несколько строк в scv с разницей в одном столбце

Надо изобрести/найти/купить универсальный инструмент, который бы мог превращать БД csv файл.
Если писать самому то на C# (или хотя бы python)
  • Вопрос задан
  • 190 просмотров
Пригласить эксперта
Ответы на вопрос 4
vabka
@vabka Куратор тега C#
Токсичный шарпист
С джоинами будет сложновато, но со всем остальным:
1. Определяешь тип БД (раз уже подключился - значит известен)
2. В большинстве СУБД можно динамически получить список всех таблиц/коллекций (эту информацию можно получить из служебных таблиц, имя и структура которых известна заранее)
3. По данным из п2 делаешь N запросов SELECT * from {tableName} (как в монге это сделать - не подскажу)
И через DataReader читаешь таблицу и пишешь в csv.

А ещё для некоторых субд могут быть уже готовые инструменты для экспорта данных.
Например mysqldump, pg_dump, mongodump итд, которые как раз и делают вышеописанное.

На счёт джоинов - никогда подобное не видел, и в общем случае такое сделать не получится.
Ответ написан
Комментировать
@rPman
Формат csv для данной задачи наиболее неподходящий, теряется информация о структуре, особенно когда на очередной строчке количество колонок меняется и еще страшнее - если не меняется, что там лежит, что в какой колонке - не известно, машина не прочтет а человек обматерит изобретателя этого бреда.

Вторая проблема - денормализация, вот это объединение записей. Причина простая - реляционные базы данных по определению не хранят достаточно информации для понимания, чем является данные. В некоторых случаях можно что то вытащить из типа индексов (fk и pk) и ограничений constraints но в общем нет. Как понимать связь М-1-М? какую таблицу брать за базовую а какую второстепенной, т.е. что выбирать left join, right join или inner join? Да, для простых справочников, когда таблица является лепестком в графе связей 1-М можно 'смело' связывать такую таблицу, дублируя данные справочника по foreign key индексам, но опять - зачем? ведь при чтении уже не будет видно что использовался справочник.

p.s. Я могу предположить что конечная цель у автора - работа со случайными данными (много мелких проектов, написанных разными людьми с сильно оотличающимися подходами к разработке и способам хранения данных) и извлечение из них осмысленных, к примеру в заранее определенном формате
Когда то давно у меня в дипломной или рядом была проект, в котором в качестве доп инструмента была простая самописная утилита, ее натравливаешь на очередную базу с неизвестной структурой, она проводила простенький анализ структуры и выдавала в интерфейсе таблицы поля и показывала короткий брифинг по каждому выбранному полю (тип связи и пример данных там хранящихся), цель утилиты - указать таблицы и поля, из которых дальше будет извлекаться данные (т.е. дать интерпретацию этим данным). Без этой утилиты работа по определению какое поле чем является достаточно муторная, в имеющихся приложениях по работе с бд нужно много кликать, запускать хоть и заранее написанные запросы и т.п. Может вам лучше это состряпать? Я искал и не нашел, готовые универсальные решения слишком сложны (а смысл в простоте интерфейса).

в c# есть унифицированный инструмент по подключению к базам данных - ado.net (вся возня - в построителе connection string, плюс таскать с собой по больше драйверов от разных бд), плюс есть системный odbc (уже устарел но для старых баз данных это иногда единственный способ подключения) для которого есть поддержка ado.net
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
Задача недоопределена.

Например, под термином CSV можно понимать как файл единой структуры (причём как plain-структуры, так и с сериализованными данными), так и несколько конкатенированных (как в процессе вывода, так и явно по окончании вывода) файлов, каждый из которых имеет свою структуру (да ещё и дополнительная информация там может храниться, вроде имён таблиц и имён/типов полей).

Каждый из вариантов предполагает свой код для решения задачи (это если не обращать внимания на такую мелочь, что сама по себе запись в CSV в каждой СУБД делается тоже ну очень по-своему).

А так - вот не вижу ну никакой проблемы. Лишь бы на той стороне обработки этого CSV был код, который правильно интерпретирует данные и корректно разложит их обратно по таблицам. Причём если идёт речь о создании универсального инструмента, то только в этом самом последнем моменте (вывод результата запроса в CSV) могут возникнуть хоть какие-то сложности. Остальное просто и плоско, как блин.

Я не знаю их архитектуру и название таблиц заранее

Хотя вот ещё одна точка, где могут возникнуть сложности. Теоретически все СУБД должны бы поддерживать INFORMATION_SCHEMA, всё же стандарт как бы описывает - и всё равно не всё там просто и очевидно.
Ответ написан
alekseyHunter
@alekseyHunter
Android developer
Таблиц несколько и они разных видов (oracl, mongo, mysql и т.д.)

Что? Это не таблицы, а СУБД. У вас таблицы БД хранятся в разных СУБД?

Я не знаю их архитектуру и название таблиц заранее

Это уже напоминает взлом.

Если есть связь Many to Many, значит будет несколько строк в scv с разницей в одном столбце

Смотря сколько join'ов вы намерены сделать.

Надо изобрести/найти/купить универсальный инструмент

Как говорится - Welcome. Изобретайте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы