В сети до сих пор висят мануалы из 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
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/