Мне нужно повлиять на количество строк в PostgreSQL Python или Django при выполнении одного и того же запроса 2 или более раз
Мне нужно получить количество всех затронутых строк в PostgreSQL. Если я выполняю запрос обновления, то получаю правильное количество рядов, но если я выполняю тот же запрос снова, то также получаю то же количество рядов, но я думаю, что во второй раз ни один ряд не пострадал, поэтому в этом случае количество рядов будет равно 0. Вот мой простой код
import psycopg2
#db connection
conn = psycopg2.connect(
host="localhost",
database="test_db",
user="postgres",
password="123456"
)
#Setting auto commit false
conn.autocommit = True
#Creating a cursor object using the cursor() method
cursor = conn.cursor()
sql = "UPDATE test_table SET balance = 11 WHERE last_block = '14529343'"
cursor.execute(sql)
print("Rows returned = ",cursor.rowcount)
conn.commit()
conn.close()
#Closing the connection
После выполнения этого скрипта python мой текущий затронутый ряд:
Возвращенные строки = 70
второй раз также выводим то же самое
Возвращенные строки = 70, но это не правильно, результат будет 0
но если я выполню тот же запрос обновления, то результат будет тот же, но в этом случае на выходе будет 0.
Вот скриншот
Ваше утверждение никакие данные не будут обновлены неверно, на самом деле точно такие же строки будут обновлены снова, даже если это будет то же самое значение. Значение столбца balance
не изменится, но строки будут обновлены. Оператор update
не смотрит на существующие значения, чтобы увидеть, что они изменились. Он определяет, какие строки обрабатываются только условиями в предложении where
. Поскольку вы не обновили единственные критерии в where
, а затем запустили снова с тем же where
, будут обработаны те же строки. Вы можете убедиться в этом, выбрав также CTID
Физическое расположение версии строки в ее таблице. Обратите внимание, что хотя ctid может быть использован для быстрого нахождения версии строки, ctid строки изменится, если она будет обновлена или перемещена с помощью VACUUM FULL.
(Подчеркнуто мной)
Смотрите демо здесь. Обновление - это не то же самое, что изменение значения.