Ведение ORM с помощью хранимых процедур - PullRequest
4 голосов
/ 25 февраля 2010

Я занимаюсь разработкой веб-приложения Python, использующего sqlalchemy для связи с базой данных mysql. До сих пор я в основном использовал ORM-слой sqlalchemy для общения с базой данных. Самым большим преимуществом ORM для меня была скорость разработки: не нужно писать все эти SQL-запросы, а затем сопоставлять их с моделями.

Однако недавно мне пришлось изменить свой дизайн, чтобы связываться с базой данных с помощью хранимых процедур. Кто-нибудь знает, есть ли способ использовать sqlalchemy ORM слой для работы с моими моделями через хранимые процедуры? Есть ли другая библиотека Python, которая позволила бы мне сделать это?

Как я вижу, я могу написать свои собственные операторы выбора, вставки, обновления и удаления, прикрепить их к модели и позволить библиотеке сделать все остальное. Я просматривал документацию sqlalchemy несколько раз, но, похоже, не могу найти способ сделать это.

Любая помощь с этим была бы великолепна!

1 Ответ

3 голосов
/ 26 февраля 2010

SQLAlchemy не имеет хорошего способа конвертировать вставки, обновления и удаления в вызовы хранимых процедур. Вероятно, было бы не так сложно добавить возможность иметь вместо_ {update, insert, delete} расширения на мапперах, но пока никто не беспокоился. Я считаю требование, чтобы простые операторы DML проходили через хранимые процедуры довольно глупо. Это действительно не предлагает ничего, что вы не могли бы сделать с триггерами.

Если вы не можете избежать глупости, есть несколько способов, с помощью которых вы можете использовать SQLAlchemy. Вы потеряете часть функциональности ORM. Вы можете создавать объекты ORM из результатов хранимых процедур, используя query (Obj) .from_statement (text ("...")), просто чтобы метки столбцов в выражении соответствовали именам столбцов, которые вы указали SQLAlchemy для сопоставления.

Один из способов справиться с операторами DML - отключить автоматическую очистку и вместо очистки пройти через атрибуты сеансов .new, .dirty и .deleted, чтобы увидеть, что изменилось, выполнить соответствующие операторы как вызовы хранимых процедур и удалить объекты до совершение.

Или вы можете просто отказаться от отслеживания состояния SQLAlchemy и напрямую вызывать вызовы хранимых процедур.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...