2009-04-02 4 views

ответ

4

Я не думаю, что (поправьте меня, если я ошибаюсь) установить или заменить в любой из стандартов SQL; это специфичная для SQLite вещь. Существует MERGE, но это не поддерживается всеми диалектами. Поэтому он недоступен в общем диалекте SQLAlchemy.

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

6
Session.save_or_update(model) 
+0

Это не мой дело. Я не использую сеанс, я напрямую использую Connection, поэтому это должно быть сделано с использованием языка выражения SQL и conn.execute (...) – honzas

+2

В любом случае, это 0.4 SQLA, для 0.5 вам нужно использовать Session.add (модель) – Jiri

8

Что относительно Session.merge?

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

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

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

из http://www.sqlalchemy.org/docs/reference/orm/sessions.html

1

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

+0

Это похоже на [этот ответ] (http://stackoverflow.com/questions/2218304/sqlalchemy-insert-ignore/2224729#2224729). –

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