Python MySQL не обновляется - PullRequest
       20

Python MySQL не обновляется

0 голосов
/ 18 сентября 2018

У меня есть две программы: одна заполняет и обновляет базу данных, а другая выбирает информацию из базы каждые 10 секунд.

Я использую Pymysql.

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

Нужно ли делать специальный запрос, отличный от * 1007?*?Нужно ли закрывать соединение и открывать его перед всеми запросами?

Я создаю класс GetData при запуске программы и вызывается get_data каждые 10 секунд.

class GetData:
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', user='root', password='', db='mydb', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

    def get_data(self, data):
        with self.conn.cursor() as cursor:
            self.sql = "SELECT id_data, somedata FROM mytable WHERE (%s = 'example');"
            cursor.execute(self.sql, (data,))
        return cursor.fetchall()

    def close_conn(self):
        self.conn.close()

Программа, заполняющая базу данных:

class FillDb:
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', user='root', password='', db='mydb', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
        #added this line but doesen't help!
        self.conn.autocommit(True)

    def add_in_db(self, data):
        with self.conn.cursor() as cursor:
            self.sql = "INSERT INTO mytable (somedata) VALUES (%s);"
            cursor.execute(self.sql, (data,))
            self.conn.commit()

1 Ответ

0 голосов
/ 18 сентября 2018

Почему вы не видели обновлений:

Причиной такого поведения является уровень изоляции InnoDB по умолчанию REPEATABLE READ .С REPEATABLE READ первый неблокирующий SELECT создает снимок, представляющий данные на данный момент времени.Все последовательные разблокирующие SELECT читаются из того же снимка.Обновления БД из других транзакций не отражаются в этом снимке, поэтому остаются прозрачными.

Фиксация транзакции (или ее закрытие и создание новой) приведет к созданию нового снимка со следующим запросом, представляющего данные в БД в , что момент времени.Вот как MySQL реализует Согласованные неблокирующие чтения как часть их стратегии соответствия ACID .

Почему with self.conn работает и что делает:

В PyMySQL есть две (соответствующие) реализации контекстного менеджера, одна на Курсор (более или менее «задокументировано») и одна на Соединение (можно найтив коде: D).

Когда вы использовали with self.conn.cursor() as cursor:, действовала реализация курсора.Ввод возвращенного контекста self (объект курсора, возвращенный методом cursor() в self.conn);оставив контекст в конечном итоге закрыл этот курсор.Это не влияет на транзакцию.

При использовании with self.conn as cursor действует реализация соединения.Вход в контекст возвращает курсор от вызова self.cursor();выход из контекста приводит к commit или rollback транзакции.Курсор также неявно закрывается.

Итак, неявный вызов self.commit при выходе из контекста реализации соединения «истекает» существующий снимок в вашей транзакции и вынуждает создать новый вследующая итерация вашего цикла, которая потенциально содержит ваши вставки, если их фиксация завершена до создания указанного нового снимка.

...