[Python] Memorandum zur Vermeidung von SQLAlchemy-Fehlern

Einführung

Normalerweise verwende ich SQLAlchemy, wenn ich MySQL von Python aus treffe. Ich bin bei der Entwicklung in Local nicht besonders belästigt, aber nach der Bereitstellung mit uwsgi in einer Umgebung in der Nähe der Produktion trat häufig das Phänomen auf, dass das System aufgrund eines mysteriösen Fehlers abstürzte.

_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')

Und

_mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')

Und

sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back 

Und dieser Fehler ...

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request 

Nach der Untersuchung sind viele Menschen auf dieses Problem gestoßen und haben verschiedene Lösungen erhalten. Da es jedoch je nach Blog unterschiedlich ist, habe ich es von Anfang an versucht.

Ich werde ein Memorandum darüber hinterlassen, was funktioniert hat, aber da es ein Rätsel um die Wahrheit ist, würde ich es begrüßen, wenn Sie mir sagen könnten, ob es falsch erscheint.

Ausführungsumgebung

Gegenmaßnahmen

Beginnen Sie als Voraussetzung an der Stelle, an der die Engine und die Sitzung wie folgt erstellt wurden.

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker


metadata = MetaData()
engine = create_engine(uri, encoding='utf-8', pool_recycle=3600)
session = scoped_session(sessionmaker(autocommit=False,
                                      expire_on_commit = False,
                                      autoflush=True,
                                      bind=_engine))
metadata.create_all(bind=engine)

Überprüfen Sie pool_recycle

[Referenz] Python: Lösen Sie das Problem, dass mein MySQL-Server in SQLAlchemy verschwunden ist.

Laut Referenzseite ist dieser Fehler

Tritt auf, wenn SQLAlchemy eine SQL-Anweisung ausgibt, während die Verbindung zu MySQL abgelaufen ist

Überprüfen Sie also zuerst das wait_timeout auf der MySQL-Seite und geben Sie einen kleineren Wert in pool_recycle an.

Überprüfen Sie die Einstellung wait_timeout auf der SQL-Seite und überprüfen Sie sie

> show global variables like 'wait_timeout';
+--------------------------+----------+
| Variable_name            | Value    |
+--------------------------+----------+
| innodb_lock_wait_timeout | 50       |
| lock_wait_timeout        | 31536000 |
| wait_timeout             | 600      |
+--------------------------+----------+
3 rows in set (0.00 sec)

Es wurde kleiner als die angegebene Zeit von pool_recycle gemacht (diesmal 60 für den Test). Ich hatte das Gefühl, dass die Anzahl der Fehler etwas abgenommen hatte, aber das Problem blieb bestehen und ich suchte nach einer anderen Methode.

Schließen Sie die Sitzung jedes Mal am Ende einer Anfrage

[Referenz] [Python] Kampf gegen SQL-Alchemie

Laut der Referenzseite ist es wichtig, das Auslassen des Sitzungsabschlusses zu vermeiden

@app.teardown_appcontext
def session_clear(exception):
    if exception and session.is_active:
        session.rollback()
    else:
        session.commit()

    session.close()

Flask '@ app.teardown_appcontext' wird jedes Mal am Ende der Anfrage aufgerufen, daher schließen Sie die Sitzung hier explizit. Die meisten Fehler sind bisher verschwunden, aber manchmal verschwindet SQL.

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request 

Verschwindet nicht egal was. .. ..

Pingen Sie den mysqlserver an, um einen Prozess zu erzeugen

[Referenz] MySQL-Server wurde mit Flask und SQL Alchemy entfernt

Dies ist der letzte Weg dorthin. Wenn die Verbindung geschlossen ist, starten Sie den Vorgang zuerst im Voraus. Ist es die Methode? Vorerst wurden alle Fehler behoben.

from sqlalchemy import exc
from sqlalchemy import event
from sqlalchemy.pool import Pool

@event.listens_for(Pool, "checkout")
def ping_connection(dbapi_connection, connection_record, connection_proxy):
    cursor = dbapi_connection.cursor()
    try:
        cursor.execute("SELECT 1")
    except:
        raise exc.DisconnectionError()
    cursor.close()

abschließend

Es gibt einige Websites, die dieses Problem erwähnen, aber ich habe versucht, diejenigen zu zitieren, die funktioniert haben. Die Site, die ich dieses Mal zitiert habe, hat auch verschiedene Trial-and-Error-Prozesse. Wenn Sie also mit ähnlichen Problemen konfrontiert sind, sollten Sie sich meiner Meinung nach auch darauf beziehen. Ich würde es begrüßen, wenn Sie mir sagen könnten, ob es einen besseren Weg gibt oder ob die Grundursache überhaupt nicht da ist.

Verweise

--Python: Lösen Sie das Problem, dass mein MySQL-Server in SQLAlchemy verschwunden ist (http://blog.amedama.jp/entry/2015/08/15/133322).

Recommended Posts

[Python] Memorandum zur Vermeidung von SQLAlchemy-Fehlern
#python python Vermeidung japanischer Syntaxfehler
Python-Memorandum
Python-Memorandum 2
Python-Memorandum
Python Memorandum
Python Memorandum
Python-Memorandum
Python Memorandum
Python-Memorandum
Python-Grundmemorandum
Python Pathlib Memorandum
Python-Memorandum (Algorithmus)
Python-Fehlerbehandlung
Python-Memorandum [Links]
Python-Memorandum-Nummerierungsvariablen
Python Memorandum (sequentielle Aktualisierung)
Python nicht implementiert Fehler
Python-Memorandum (persönliches Lesezeichen)
Python-Fehlerliste (Japanisch)
Python Basic Memorandum Teil 2
Memorandum @ Python ODER Seminar
Python Memorandum Super Basic
[Python] für Anweisungsfehler
Cisco Memorandum _ Eingabekonfiguration mit Python
ABC-Memorandum [ABC163 C --managementr] (Python)
Python-Anfänger-Memorandum-Funktion
Memorandum @ Python ODER Seminar: matplotlib
Memorandum über Korrelation [Python]
[youtube-dl] python3 SSL-Fehler (CERTIFICATE_VERIFY_FAILED)
Memorandum @ Python ODER Seminar: Pulp
Python-Metaklasse und SQLalchemie deklarativ
Fehler beim Spielen mit Python
Ein Memorandum über den Python-Mock
Memorandum @ Python ODER Seminar: Pandas
Memorandum zur Fehlerbehandlung bei PyCUDA-Builds
[Python] Memorandum über zufällige Generationen
Memorandum @ Python ODER Seminar: Scikit-Learn
Fehlerbehebung Python-Versionsprüfung
Python-Memorandum zur parallelen / asynchronen Ausführung
ABC-Memorandum [ABC159 C - Maximales Volumen] (Python)
Python pywin32 (win32com) Excel-Memorandum
Python-Fehler: ModuleNotFoundError: Kein Modul mit dem Namen 'flask'
[Python] Ein Memorandum der schönen Suppe4