2010-02-24 2 views
4

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

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

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

Любая помощь с этим будет замечательной!

ответ

2

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

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

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

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

Смежные вопросы