Счетчик строк psycopg2 для UPDATE не равен нулю даже без изменений UPDATE - PullRequest
0 голосов
/ 13 апреля 2020

Следуя документации для rowcount , я смогу узнать, сколько строк было обновлено с помощью запроса UPDATE, например,

>>> cur = conn.cursor()
>>> cur.execute(
    'UPDATE users SET current_session_active=%(current_session_active)s WHERE users.id = %(id_1)s AND users.app = %(app_1)s',
     {'current_session_active': False, 'id_1': '884492906', 'app_1': 'Telegram'}
)
>>> cur.rowcount
1

Я понимаю cur.rowcount = 1 как " В выбранной строке для поля current_session_active установлено значение True, а теперь вы обновили его до False ". Я запутываюсь, когда повторяю запрос, и получаю одно и то же значение для cur.rowcount

>>> cur = conn.cursor()
>>> cur.execute(
    'UPDATE users SET current_session_active=%(current_session_active)s WHERE users.id = %(id_1)s AND users.app = %(app_1)s',
     {'current_session_active': False, 'id_1': '884492906', 'app_1': 'Telegram'}
)
>>> cur.rowcount
1
>>> cur.execute(
    'UPDATE users SET current_session_active=%(current_session_active)s WHERE users.id = %(id_1)s AND users.app = %(app_1)s',
     {'current_session_active': False, 'id_1': '884492906', 'app_1': 'Telegram'}
)
>>> cur.rowcount
1

Поскольку эти два UPDATE идентичны, я ожидаю, что у второго будет cur.rowcount = 0 , поскольку данные уже были обновлены в первый раз, и во второй раз обновлять нечего. Почему я получаю cur.rowcount = 1 во второй (и n-й) раз?

1 Ответ

0 голосов
/ 13 апреля 2020

Как упоминалось в комментариях @Cavin Dsouza, чтобы получить cur.rowcount = 1 только при изменении значения строки, необходимо добавить поле в предложении WHERE, чтобы отфильтровать строки, которые не будут обновлены.

>>> cur = conn.cursor()
>>> cur.execute(
    'UPDATE users SET current_session_active=%(current_session_active)s WHERE users.current_section_active = TRUE AND users.id = %(id_1)s AND users.app = %(app_1)s',
     {'current_session_active': False, 'id_1': '884492906', 'app_1': 'Telegram'}
)
>>> cur.rowcount 
1
>>> cur.execute(
    'UPDATE users SET current_session_active=%(current_session_active)s WHERE users.current_section_active = TRUE AND users.id = %(id_1)s AND users.app = %(app_1)s',
     {'current_session_active': False, 'id_1': '884492906', 'app_1': 'Telegram'}
)
>>> cur.rowcount
0
...