20.02.2009

Из dbf в MySQL и обратно. Производственная драма с эпилогом.

В декабре прошлого года я описывал свои злоключения с конвертацией некой БД из dbf в MySQL и vice versa. Что ж - вот и продолжение.

Поскольку dbf2mysql в части перегона dbf в MySQL меня вполне устраивал (несмотря на кульбит с "сделать дамп базы с принудительным выставлением latin1, sed'ом заменить в нём latin1 на utf8 и iconv'ом сменить кодировку с cp866 на utf8"), то я сосредоточился на написании простенькой утилиты позволяющей взять произвольную таблицу произвольной БД в MySQL и конвертировать её в dbf-формат.

В качестве инструментов для этой задачи были выбраны Ruby и Python. Поскольку мои знания обоих языков абсолютно одинаковы (т.е. равны нулю), то выбор между ними решался высоконаучным методом "подбрось монетку".

В качестве первого варианта был использован Ruby.
За 40 минут был слеплен скрипт, который считывал данные из таблицы в MySQL и загонял их в dbf с помощью модуля rbase.

Тестовый прогон показал, что всё работает. За одним исключением - полученный dbf упорно отказывался открываться. Сходив на сайт проекта и обнаружив открытый аж в январе 2007 года баг на эту же тему я задумался...

В итоге, было принято судьбоносное решение писать следующий вариант на python'е. Что и было сделано.

Первоначально был использован модуль YDbf. На тестовой таблице, состоящей из пяти полей и полумиллиона записей, он показал весьма неплохую скорость и управился за полторы минуты. Увы, на реальных данных (те же полмиллиона записей, но уже 70 полей), он попросту молча умирал примерно через 15 минут.

Несмотря на это, не могу не выразить благодарность его автору, который оперативно проконсультировал меня по jabber'у, когда у меня возник вопрос.

Следующим был опробован модуль dbfpy.
С ним проблем практически не возникло, за исключением того, что вместо пустых полей (тип дата) он вписывал текущее число. Учитывая наличие в тестовой таблице пустого поля "дата смерти", увидеть в итоговом файле кучу людей с текущей датой в этом поле было несколько... неожиданно. Эдакий массовый геноцид.

Однако один из разработчиков откликнулся довольно быстро и немедленно выложил в CVS обновлённую версию. С ней всё заработало как надо и стало выдавать на-гора нужные результаты.

Итоги:
- написание собственного скрипта - задача вполне посильная даже при отсутствии знания ЯП как такового.
- кроме того, что это само по себе увлекательно, я выявил довольно много ляпов в самой БД, которые иначе могли бы оставаться там долго.
- чёткое ощущение, что dbf-модули н сегодняшний день разрабатывают только русскоговорящие программисты. :)

Эпилог.

К моменту когда я закончил писать скрипт, меня пригласили на другую работу. Поскольку остающийся вместо меня человек с линуксом не работал и не предполагает этого делать, я озадачился поиском клиента к MySQL для windows. Таковым стал Navicat, который, как выяснилось, умеет импортировать из dbf в MySQL и экспортировать из MySQL в dbf. С последним не всё гладко, но всё же. Так что если кто-то может подсказать, как обычная российская контора может купить этот самый Navicat - мне интересно. Да, это не реклама Navicat'а. Это жизнь такая. :)

3 прокомментировало:

  1. > чёткое ощущение, что dbf-модули н сегодняшний день разрабатывают только русскоговорящие программисты.
    ___
    В начале 90-х сочинение баз dbf всего, чего угодно было очень хлебным занятием. Видимо, борьба с тяжким наследием того времени будет актуальной ещё долго.
    Кстати, ещё один пример единомыслия на Руси без всяких проектов от Каткова: кажется, ни в одной стране мира dbf не использовался так широко и повсеместно. А, скажем, о db многие dbase- и foxpro'шные программеры вообще не слышали :)

    ОтветитьУдалить
  2. Ну почему же было?
    Дело это живёт :)

    Вот, например, феерический срач на эту тему. Рекомендую к прочтению.

    Да и автор упомянутой мной библиотеки YDbf работает в конторе, родственной той, в которой работал я.

    Скажу честно, несмотря на все доводы авторов clip'а, чем скорее перейдут на что-то более другое - тем лучше.
    1С уже. Разнообразные АРМы видимо будут переписываться. Ну и et cetera, et cetera...

    Вопрос в том - какой формат файлов использовать для обмена информацией в таком случае? SQL-дамп?

    ОтветитьУдалить
  3. За что мне полюбился питон - так это за возможность писать простенькие программы методом google python action :)
    Хотя на днях я написал таким же методом простейшего демона на Си.

    ОтветитьУдалить