Я не думаю (поправьте меня, если я ошибаюсь) ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ в любом из стандартов SQL; это специфичная для SQLite вещь. Существует MERGE, но это поддерживается не всеми диалектами. Так что это не доступно на общем диалекте SQLAlchemy.
Самое чистое решение - использовать сессию, как было предложено М. Утку. Вы также можете использовать SAVEPOINT для сохранения, попробуйте: вставить, кроме IntegrityError: затем выполнить откат и вместо этого выполнить обновление. Третье решение - написать INSERT с OUTER JOIN и предложением WHERE, которое фильтрует строки с нулями.