2016-07-13 12 views
0

Ich möchte einen Teil des Ergebnisses vom Cursor lesen und dann schließen, ohne das Ergebnis zu lesen. cursor.close() ausgelöst InternalError: Unread result found. Ist es möglich, den Cursor zu schließen, ohne alle Ergebnisse zu durchlaufen oder Pufferoption zu verwenden?Python mysql.connector InternalError: Ungelesenes Ergebnis beim Schließen des Cursors

Update:

Meine Anfrage über 3000 Einträge, ich wollen zunächst mehrere Datensätze zu bekommen, die einige Bedingungen passen. Nachdem ich einen Teil des Ergebnisses durchlaufen habe, bekomme ich, was ich will. Dann möchte ich nur ungelesene Ergebnisse aufgeben. Ich benutze keine Pufferoption, die, wie ich weiß, alle Ergebnisse sofort lesen wird. Diese Frage wird Duplikat nicht von Python MySQL connector - unread result found when using fetchone

def chooseInstrumentsFromOrigin(self, time): 
    sql = """select symbol, name, total_ratio, outstanding_ratio from market_values 
      where time = %s order by {captype} asc""".format(captype=self.strategy_data['captype']) 

    args = [time] 

    conn = mysql.connector.connect(**mysql_config) 
    cursor = conn.cursor(dictionary=True) 
    cursor.execute(sql, args) 

    # This function will return half way. 
    symbols = self.chooseInstrumentsFromLeaders(time, cursor) 

    # I don't want this line! 
    for i in cursor: pass 

    cursor.close() 
    conn.close() 

    return symbols 
+0

Mögliches Duplikat [Python MySQL-Anschluss - ungelesen Ergebnis gefunden, wenn fetchone mit] (http://stackoverflow.com/questions/29772337/python-mysql- connector-unread-result-found-when-using-fetchone) – shivsn

+0

@shivsn Nein, es ist kein Duplikat. Bitte sehen Sie mein Update. – gzc

+0

Zeigen Sie Ihren Code. – Drew

Antwort

1

Es scheint, dass Sie brauchen:

cursor = conn.cursor(buffered=True,dictionary=true) 

um ein Resultset der Mitte des Stromes zu verlassen.

Volle Offenbarung, ich bin ein MySQL-Entwickler, kein Python-Entwickler.

Siehe Python-Handbuch Seite MySQLConnection.cursor() Method und cursor.MySQLCursorBuffered Class.

Alle Zeilen werden sofort gelesen, wahr. Fantasisch für kleine bis mittelgroße Resultsets.

Letztere Bezug über Zustände:

For queries executed using a buffered cursor, row-fetching methods such as fetchone() return rows from the set of buffered rows. For nonbuffered cursors, rows are not fetched from the server until a row-fetching method is called. In this case, you must be sure to fetch all rows of the result set before executing any other statements on the same connection, or an InternalError (Unread result found) exception will be raised.

Als Randbemerkung, können Sie Ihre Strategie durch die Verwendung Paginierung ändern. Die MySQL LIMIT clause unterstützt dies mit den Offset-Einstellungen pagesize:

[LIMIT {[offset,] row_count | row_count OFFSET offset}] 
+0

Aber ich möchte keine linken Zeilen vom Server holen. Vielleicht reicht es, die ersten 100 Zeilen zu holen. – gzc

+0

nichts wie ein mysql '.... Limit Offset, pageSize' für die Seitennummerierung. '[LIMIT {[offset,] row_count | row_count OFFSET offset}] '...' LIMIT 100' – Drew

+0

Ihre Antwort ist also unmöglich und ich muss die gepufferte Option verwenden. In diesem Punkt ist diese Frage tatsächlich ein Duplikat. – gzc

Verwandte Themen