Явная проверка, успешно ли завершилась операция SQL INSERT? - PullRequest
0 голосов
/ 25 февраля 2019

Я использую Python для общения с СУБД Postgres с использованием psycopg2.

Можно ли предположить, что если INSERT возвращается без вызова исключения, то этот INSERT действительно сохранил что-то новое в базе данных?

Прямо сейчас я проверял атрибут 'rowcount' курсора базы данных, и если он равен 0, это означает, что INSERT не выполнен.Однако я начинаю думать, что в этом нет необходимости.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

По умолчанию postgres вернет None для успешной вставки:

cursor.execute - метод возвращает None.Если запрос был выполнен, возвращаемые значения могут быть получены с помощью методов fetch * ().

http://initd.org/psycopg/docs/cursor.html

Если вы хотите что-то узнать о вставке, просто /эффективный вариант - использовать RETURNING (который принимает те же параметры, что и SELECT):

INSERT INTO ... RETURNING id
0 голосов
/ 26 февраля 2019

Можно ли предположить, что если INSERT возвращается без вызова исключения, то этот INSERT действительно сохранил что-то новое в базе данных?

Нет.

Число затронутых записей будет равно нулю, если:

(... и, возможно, больше, хотя ничего не приходит на ум.)

Общая нитьчто это повлияет только на ноль записей, если вы сказали ему , так или иначе.Если вы хотите рассматривать какой-либо из них как «сбой», сильно зависит от логики вашего приложения.

Все, что однозначно является «провалом» (нарушение ограничения, сбой сериализации, нехватка места на диске ...)должен выдать ошибку, поэтому проверка количества записей, как правило, не требуется.

0 голосов
/ 26 февраля 2019

нашел похожий вопрос здесь, Как проверить, успешно ли вставлено значение?

кажется, они используют метод подсчета строк, чтобы проверить, правильно ли были вставлены данные.

...