mysql.connector не выдает последнее состояние базы данных в Python

#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)