2015-11-06 13 views
5

Sto usando pymysql.cursors e un esempio di codice semplificato che consente di caricare una riga da una tabella e stampa ogni secondo è:PyMySQL apparentemente restituisce valori vecchi/di istantanea/non rieseguire la query?

#!/usr/bin/env python3 
import pymysql.cursors 
import time 

conn = pymysql.connect(host='localhost', 
    # credentials etc. 
    cursorclass=pymysql.cursors.DictCursor) 

while True: 
    with conn.cursor() as cursor: 
     cursor.execute("SELECT * FROM state limit 1;") 
     vals = cursor.fetchone() 
     print (vals) 
     time.sleep(1) 

stato è una tabella con una sola riga di un database MariaDB.

Ora mentre è in esecuzione se accendo un client MySQL e cambio il contenuto della tabella, questo script continua a pompare il valore originale; a quanto pare non sta consultando il database (!).

Sono un neofita di Python e sono sicuramente nuovo di PyMySQL, quindi apols se questa è una domanda stupida ma ho un po 'di RTM e sembra solo strano.

+0

Stai commettendo la tua modifica nel tuo client MySQL? – Andy

+0

Sì, l'autocommit del mio client e l'ho provato. – artfulrobot

risposta

4

Non capisco il motivo per cui ciò è necessario, ma si può risolvere il problema da una

  1. Aggiungendo autocommit=True nei parametri connect().

  2. Chiamare conn.commit() dopo il comando cursor.execute().

Sembra avvia una transazione su un'istantanea o qualcosa di predefinito. Io (nervosamente!) Ho inviato uno issue sul repository pymysql, poiché non avevo sentito niente qui. Questo è stato chiuso immediatamente con la spiegazione

E 'repeatable read

Se qualcuno sa qualcosa di meglio che usare autocommit fatemelo sapere.

+0

Grazie. Questo mi ha salvato la giornata. – Strabek