Соединение MySQL-python не видит изменений в базе данных, сделанных на другом соединении, даже после того, как изменение зафиксировано - PullRequest
15 голосов
/ 16 февраля 2012

Я использую модуль MySQLdb для Python (предварительно скомпилированный двоичный файл v1.2.3 для Windows Python 2.7) для чтения и записи данных в базу данных MySQL. После того, как соединение открыто, я могу использовать это соединение, чтобы наблюдать изменения, внесенные в базу данных для того же соединения, но не вижу изменений, сделанных с использованием другого соединения, независимо от того, было ли другое соединение выполнено в Python или есть изменение, сделанное с использованием клиент командной строки MySQL. В случае, когда я делаю обновления с использованием Python, обратите внимание, что я выполняю команду commit () для соединения.

Пример программы, которая вставляет новые записи в тестовую таблицу с одним столбцом VARCHAR:

import MySQLdb

conn = MySQLdb.connect("localhost", "test", "test", "test")
c = conn.cursor()
c.execute("INSERT INTO test VALUES(%s)", ("Test",))
conn.commit()
c.close()
conn.close()

Пример программы, которая завершает печать с постоянным счетом записей (вместо печати самого последнего счетчика записей). Я смог обновить счет только путем удаления и повторного запуска сценария или открытия нового соединения каждый раз, когда выполняется оператор SELECT.

import MySQLdb

conn = MySQLdb.connect("localhost", "test", "test", "test")

while True:
    input = raw_input("Enter anything: ")
    if input == "exit":
        break

    c = conn.cursor()
    c.execute("SELECT COUNT(*) FROM test")
    res = c.fetchone()[0]
    c.close()

    print("Number of records: %d" % res)

1 Ответ

12 голосов
/ 16 февраля 2012

Попробуйте это

import MySQLdb
import time

from MySQLdb.cursors import SSCursor
conn = MySQLdb.connect("localhost", "test", "test", "test")


while True:
    input = raw_input("Enter anything: ")
    if input == "exit":
        break
    c = conn.cursor()
    conn.begin()
    c.execute("SELECT COUNT(*) FROM test")
    res = c.fetchone()[0]
    #c.commit()
    c.close()

    print("Number of records: %d" % res)

Определение курсора состоит в том, что он будет хранить данные до их изменения.Таким образом, вы должны дать указание курсору, begin или commit используя ваше соединение.Это сообщит курсору, что вам нужно прочитать новые данные из базы данных.

Надеюсь, что это решит ваш запрос.

Мы также узнаем что-то новое из вашего вопроса:).

...