SQLAlchemy - вставьте или замените эквивалент - PullRequest
11 голосов
/ 02 апреля 2009

Кто-нибудь знает, что эквивалентно предложению SQL «INSERT OR REPLACE» в SQLAlchemy и его языке выражений SQL?

Большое спасибо - хонзас

Ответы [ 4 ]

9 голосов
/ 08 апреля 2010

А как же Session.merge?

Session.merge(instance, load=True, **kw)

Скопируйте состояние экземпляра на постоянный экземпляр с тем же идентификатором.

Если в данный момент нет постоянного экземпляра, связанного с сеансом, он будет загружен. Вернуть постоянный экземпляр. Если данный экземпляр не сохранен, сохраните копию и верните ее как новый постоянный экземпляр. Данный экземпляр не становится связанным с сеансом. Эта операция распространяется на связанные экземпляры, если сопоставление сопоставлено с помощью cascade = "merge".

от http://www.sqlalchemy.org/docs/reference/orm/sessions.html

6 голосов
/ 02 апреля 2009
Session.save_or_update(model)
4 голосов
/ 02 апреля 2009

Я не думаю (поправьте меня, если я ошибаюсь) ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ в любом из стандартов SQL; это специфичная для SQLite вещь. Существует MERGE, но это поддерживается не всеми диалектами. Так что это не доступно на общем диалекте SQLAlchemy.

Самое чистое решение - использовать сессию, как было предложено М. Утку. Вы также можете использовать SAVEPOINT для сохранения, попробуйте: вставить, кроме IntegrityError: затем выполнить откат и вместо этого выполнить обновление. Третье решение - написать INSERT с OUTER JOIN и предложением WHERE, которое фильтрует строки с нулями.

1 голос
/ 21 апреля 2011

Вы можете использовать OR REPLACE в качестве так называемого prefix в вашей SQLAlchemy Insert - документация о том, как поместить OR REPLACE между INSERT и INTO в вашем операторе SQL, равна здесь

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