MySQL ⇄ Excel. Консольный скрипт конвертации данных

от автора

В сети до сих пор висят мануалы из 2013, где предлагают писать громоздкие скрипты на PHP с библиотекой PHPExcel или использовать встроенный импорт через веб-интерфейс phpMyAdmin. На практике эти методы спотыкаются на первой же тысяче строк: слетают кодировки, ломаются форматы дат, а дробные числа округляются до целых.

При взаимодействии разработки с менеджментом или бухгалтерией регулярно всплывает одна и та же задача. Нужно либо выгрузить таблицу из базы в Эксель для отчёта, либо, наоборот, залить обратно в СУБД тяжелый xlsx. файл со свежими ценами или списком контрагентов. Настраивать тяжелые ETL-системы ради разовой выгрузки неэффективно. Проблема решилась написанием короткого CLI-скрипта на Python — mysql_bridge. Утилита обеспечивает сквозную двустороннюю конвертацию данных, автоматически анализирует структуру и сохраняет исходные типы на лету. Исходный код скрипта и Readme Здесь. Если Вас заинтересовала или статья была полезна, поддержите звездочками.

Как устроен двусторонний мост

Вся логика инструмента умещается за счёт связки pandas, sqlalchemy и движка openpyxl. Скрипт работает с файлами Эксель напрямую на уровне бинарного кода, поэтому его можно запускать на серверах без установленного офисного софта. Утилита работает в двух режимах.

  • Экспорт. Из MySQL в Excel

Для выгрузки данных скрипт использует абстракцию SQLAlchemy, подключается к базе и одной командой считывает таблицу в виртуальный DataFrame, сохраняя системные типы данных СУБД.

def export_to_excel(table_name, excel_path):

engine = create_engine(DATABASE_URL)

df = pd.read_sql_table(table_name, con=engine)

df.to_excel(excel_path, index=False, engine=‘openpyxl’)

  • Импорт. Из Excel в MySQL с автосозданием таблиц

Самая частая проблема ручного импорта — необходимость предварительно создавать пустую таблицу в MySQL через CREATE TABLE.

В разработанном мною скрипте этот процесс автоматизирован. Pandas предварительно сканирует Эксель-файл, определяет типы данных в памяти (строки, целые числа, вещественные числа, даты) и самостоятельно генерирует валидную таблицу в MySQL перед заливкой строк.

Флаг if_exists='replace' гарантирует, что если старая техническая таблица уже существовала в базе, она будет корректно пересоздана под новую структуру файла.

def import_from_excel(excel_path, table_name):

engine = create_engine(DATABASE_URL)

df = pd.read_excel(excel_path, engine=‘openpyxl’)

df.to_sql(table_name, con=engine, index=False, if_exists=‘replace’)

Тестирование и запуск в консоли

MySQL -> Excel

Перед запуском скрипта необходимо установить зависимости, выполнив команду

pip install pandas openpyxl sqlalchemy pymysql. Инструмент управляется через флаги, позволяя экспортировать данные из MySQL в Excel (--mode export) или импортировать обратно (--mode import), с автоматической обработкой типов данных и блокировок файлов. Рассмотрим на моём примере.

  • Открываем терминал в VS Code и ставим необходимые библиотеки:

    pip install pandas openpyxl sqlalchemy pymysql

  • После установки библиотек открываем код bridge.py и прописываем доступы к нашей бд в переменную DATABASE_URL. Тестирование проводилось на локальной базе medoiy_magazin.

  • Для проверки режима экспорта выгрузим существующую таблицу товаров products в файл Excel. Для этого в терминале запускается следующая команда с флагами:

    python bridge.py --mode export --table products --file products.xlsx

Таблица products в MySQL

Таблица products в MySQL
Она же, но уже в Эксель

Она же, но уже в Эксель
Терминал

Терминал

Excel -> MySQL

Для проверки обратного режима возьмем тестовый файл с новыми данными и зальем его в СУБД. Скрипт автоматически просканирует файл, определит типы колонок в памяти и сам создаст новую таблицу excel_workers ,в нашей базе medoiy_magazin без предварительного написания SQL-запросов. Команда для импорта:

python bridge.py --mode import --file taste.xlsx --table taste.

Выгружаем таблицу Эксель в MySQL

Таблица в Эксель

Таблица в Эксель
Терминал

Терминал

Разработанный автономный инструмент оптимизирует обмен данными между СУБД и таблицами, предлагая CLI-решение для автоматизации отчетности и миграции без использования тяжелых ETL-систем. Утилита предназначена для регулярных выгрузок и интеграции в рабочие процессы, а код и документация открыты для комьюнити. Познакомьтесь с проектом на GitHub и поддержите его. Сюда

ссылка на оригинал статьи https://habr.com/ru/articles/1054274/