#python #mysql #sql-update
#python #mysql #sql-обновление
Вопрос:
Я использую mysql.connector
библиотеку на Python для отправки запроса в базу данных. Но, когда база данных изменяется после инициализации, mysql.connector
инструменты отвечают так, как если бы база данных никогда не менялась.
В качестве примера давайте представим, что у меня есть минималистичная таблица students
всего с двумя столбцами id
и name
.
---- ------
| id | name |
---- ------
| 0 | foo |
---- ------
В следующем коде запрос будет запрашивать у пользователя id
значение 0. Но внутри процесса некоторые события будут происходить извне скрипта Python и изменять базу данных.
import mysql.connector
maindb = mysql.connector.connect(
host = "<host>",
user = "<user>",
password = "<password>",
db = "<database name>"
)
cursor = maindb.cursor()
# Here, I will send outside the python script a MySQL query to modify the name of the student from “foo” to “bar” like this:
# `UPDATE `students` SET `name` = 'bar' WHERE `students`.`id` = 0;`
cursor.execute("SELECT `id`, `name` FROM `students` WHERE `id` = 0")
result = cursor.fetchall()
print(result)
Тогда я получаю этот ответ [(0, 'foo')]
. Как вы видите, Python не знает, что база данных изменилась с момента maindb.cursor()
вызова. Поэтому я получаю foo
поле имени вместо bar
ожидаемого.
Итак, как сообщить mysql.connector
инструментам получать последние обновления из базы данных при отправке запроса?
Комментарии:
1. Убедитесь, что все изменения внесены, и откройте новый курсор.
2. скрипт Python просто
SELECT
данные.UPDATE
Заявление было сделано вне Python, непосредственно из клиента MySQL для тестирования.3. @KlausD. Я также пытаюсь навести
.close()
курсор и повторить процесс,cursor = maindb.cursor()
но поведение остается тем же.
Ответ №1:
Вам нужно будет использовать сокет, или, если изменения происходят часто, ваш код перезапускается каждые x минут
Ответ №2:
Мне просто нужно .connect()
maindb
возражать и .close()
это перед каждой новой потребностью.
maindb.connect()
cursor.execute("SELECT `id`, `name` FROM `students` WHERE `id` = 0")
result = cursor.fetchall()
print(result)
maindb.close()
Комментарии:
1. Я боролся с этой проблемой целый день, и этот ответ действительно помог мне. Мне пришлось закрыть мое соединение с БД и снова инициализировать его внутри моего бесконечного цикла while. Приветствую, приятель!
Ответ №3:
База данных поддерживает целостность данных, предотвращая просмотр изменений, внесенных другими транзакциями в ходе выполнения (см. Уровни изоляции транзакций).
Вы можете commit
использовать свое соединение, чтобы позволить ему видеть новые изменения:
cursor = maindb.cursor()
# Here, I will send outside the python script a MySQL query to modify the name of the student from “foo” to “bar” like this:
# `UPDATE `students` SET `name` = 'bar' WHERE `students`.`id` = 0;`
# Doesn't show the update
cursor.execute("SELECT `id`, `name` FROM `students` WHERE `id` = 0")
result = cursor.fetchall()
print(result)
# Shows the update because we have committed.
maindb.commit()
cursor.execute("SELECT `id`, `name` FROM `students` WHERE `id` = 0")
result = cursor.fetchall()
print(result)