@gahcep

Две ORM модели для C# и Python. Нужно решение получше

Приветствую.

Описание сложившейся ситуации ниже.

В существующем проекте, для приведения которого в порядок мы и были наняты, есть активная работа с довольно большой базой данных. Причем у компании в наличии большое количество кастомеров, соответственно каждый кастомер получает свою копию базы в момента разворачивания решения.

Процесс не организован — версионность базы не ведется, рефакторинг и нормализации базы просится уже давно, обновление баз до новой версии происходит вручную инженером.

База — MS SQL Server. Встал вопрос о применении ORM слоя и перевод многочисленных изменений баз в сферу ответственности ORM инструментария (в том числе через поддержку механизма миграций). Проект написан на C#, однако так же есть гео сервис на Python очень тесно работающий с этими же базами. Python сервис находится в стадии написания и предназначен для автоматизации ряда действий с базами. На текущий момент он юзает SQL Alchemy. Миграции не настроены.

Итак: имеем C# и Python код, которые используют одну и ту же базу. C# код работает с базой напрямую (ADO.NET), python код использует SQL Alchemy.
Для работы с базой со стороны C# кода мы также решили заюзать ORM. Выбор пал на EF 6.0, хотя это не принципиально — платные решения также рассматриваются.

Таким образом складывается не очень приятная ситуация — поддержка одновременно двух моделей. То есть, меняем таблицу — меняем обе модели сразу. Это все ничего, если бы модели были в нашем ведении, но научить другую сторону работать с python + двумя новыми ORM'ам + заставить фиксировать все изменения однвременно и сразу же в двух моделях — практически нереально. Поэтому хочу спросить сообщество, может кто сталкивался с таким вопросом и как его решили. В идеале хорошо было бы вести модель только на одном языке.

Вот какие у нас (были) идеи:

1. Просто поддерживаем две ORM модели. Вариант ввиду описанного выше не подходит
2. Наиболее продвинутая модель выполняет миграции (тут речь о C# решениях — SQL Alchemy хоть и мощная, но несколько ее решений по миграции просто не работают с SQL Server'ом), а менее просто реверсит базу и отслеживает изменения (сомневаюсь что SQL Alchemy это может)
3. Описываем модель скажем на XML а потом парсим его C# и Python парсерами и просто обновляем модели.
4. Перевод python кода на IronPython. Не получится, ибо гео сервис скорее всего просто не будет работать.

Сталкивались ли вы с нечто подобным? Какое решение использовали бы вы? Что можете посоветовать.

Спасибо
  • Вопрос задан
  • 5008 просмотров
Пригласить эксперта
Ответы на вопрос 5
Weageoo
@Weageoo
Нужен дополнительный слой абстакции. Скажем, берём БД+EF, пишем веб-сервисы на WebAPI, разворачиваем WebAPI. Из кода приложений на C# обращаемся по REST, из Python так же.
Ответ написан
asm0dey
@asm0dey
Относительно простым кажется такой вариант:
1) Все модели описывать в виде JSON-Schema
2) Написать тулзу для конвертации этой схемы в код. Не должно быть сложно.
Ответ написан
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Хм. При использовании Code First Migrations для Entity Framework лезть в структуру sql вообще не надо, т.к при изменении моделей в контексте вызывается команда, которая обновляет структуру базы соответственно текущим модеям — т.е как раз версионность, и сохраняет текущую структуру ДБ у себя в коде, т.е при развертывании в чистую базу ве эти шаги миграций применяются последовательно.

Кстати, а почему вторым языком выбран питон и как ведется взаимодействие проектов?
Ответ написан
То есть, меняем таблицу — меняем обе модели сразу.


Совершенно не верный подход при использовании ORM. Правильнее — меняем модель, а базу изменяет движок ORM.
Ответ написан
suguby
@suguby
программист, python, django, mysql, git, hg, linux
Я бы остановился на 2-м варианте. Сложность конечно в том, что если два разных VCS-репозитория то замучаетесь с синхронизацией веток... Парсеры JSON/XML/etc описаний модели - еще один контур отказа как минимум, как максимум - затратный по человекочасам на разработку/поддержку.
Еще совет: подключите администрацию и "прогните" ту сторону :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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