Ищем конкретную ORM на python

Я только что унаследовал совершенно устаревшее приложение (построенное на Windows 95 - Magic7 для знатоков), теперь поддерживаемое недавно созданным mssql db (2012). Это не та система баз данных, для которой она была разработана изначально, и поэтому она имеет довольно странный дизайн для таблиц.

Я ищу ORM на Python, который поможет мне легко поговорить с этой штукой. А именно, мне нужен ORM, который может легко, например, объединить 2 таблицы, как если бы они были одной.

Например, у меня могут быть таблицы BILLS и BILLS_HISTORY с разными именами столбцов и, возможно, даже с разными типами столбцов, которые, строго говоря, отличаются друг от друга, но сегментированно содержат одну и ту же информацию (одинаковое количество столбцов, сегментарно идентичные значения).

Я ищу ORM, который позволяет мне определять только один объект Bill, который сопоставляется с обеими таблицами, и который дает мне правильные хуки, чтобы решать, куда идти и как их писать, когда требуются настройки.

Другой пример: скажем, у меня есть объект, который называется товаром. Если товар закончен, он попадает в таблицу GOODS, если он не закончен, он попадает в таблицу GOODS_UNFINISHED. Я ищу товарный объект, который может читать обе таблицы, и дать мне готовое свойство, для которого установлено правильное значение, в зависимости от того, из какой таблицы оно взято (и с крючками, чтобы изменить его с одной таблицы на другую, если свойство установлено каким-то образом).

Я в порядке с python, но раньше я не делал много такой работы с базами данных, поэтому мои знания здесь ограничены. Я мог бы и мог бы закончить тем, что написал свой собственный ORM, но это кажется пустой тратой времени для чего-то, что будет выброшено через 6 месяцев, когда будет произведен полный переход на что-то новое. Кто-нибудь знает ORM с такими возможностями? Я планирую изучить ponyORM и SQLAlchemy, но чувствую, что мне понадобится несколько дней, чтобы прийти к выводу, подходят ли они для моего случая использования. Так что я подумал, что спрошу и у сообщества ...

Ваше здоровье

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
209
1

Ответы 1

Для записи я пришел к гибридному подходу с использованием sqlalchemy.

Sqlalchemy не был достаточно гибким, чтобы делать все, что я хотел из коробки, и не содержал подробностей, но имел необходимые функциональные возможности, чтобы продвинуться вперед, если кто-то взял на себя труд явно написать все необходимое. Итак, я написал программу, которая генерирует около 6000 строк кода sqlalchemy, чтобы иметь отображение 1 к 1 между объектами sqlalchemy и таблицами требуемым способом (в основном определяя все явно для sqla). Sqlalchemy имеет много хуков во время автозагрузки, но я обнаружил, что сложно / невозможно использовать разные хуки и одновременно настраивать мелкозернистое поведение на каждом хуке, поэтому я пошел автоматическим явным способом.

Поверх этих объектов sqlalchemy я написал объекты, которые обертывают их, чтобы скрыть элементы управления трафиком «какая таблица». Немного путаница, и я думаю, что мог бы что-то сделать с объектами наследования типов и sqlachemy, но время шло, и мне нужно было очень мало функциональности или ремонтопригодности на этом уровне, поэтому просто забегаю вперед.

Другие вопросы по теме