2017-12-08 3 views
1

Ich muss ein einfaches Projekt in Flask erstellen. Ich möchte SQLAlchemy nicht verwenden. Im folgenden Codefragment verwendet jeder, der eine Verbindung zum Server herstellt, dasselbe Verbindungsobjekt, aber für jede Anforderung wird ein neues Cursorobjekt erstellt. Ich frage das, weil ich Python DB API noch nie zuvor auf diese Weise benutzt habe. Ist es richtig? Soll ich für jede Anfrage ein neues Verbindungsobjekt anlegen oder für jede Anfrage oder die Methode unten das gleiche Verbindungs- und Cursorobjekt verwenden? Welches ist korrekt?Ist in WSGI-Anwendungen eine globale Datenbankverbindung zulässig?

import mysql.connector 
from flask import Flask, request 
app = Flask(__name__) 

try: 
    con = mysql.connector.connect(user='root',password='',host='localhost',database='pywork') 
except mysql.connector.Error as err: 
    print("Something went wrong") 

@app.route('/') 
def home(): 
    cursor = con.cursor() 
    cursor.execute("INSERT INTO table_name VALUES(NULL,'test record')") 
    con.commit() 
    cursor.close() 
    return "" 
+0

Nachdem Sie darüber nachgedacht haben, dass Transaktionen (falls verfügbar) an die Verbindung und nicht an den Cursor gebunden sind, sollten Sie wahrscheinlich eine separate Verbindung pro Anfrage haben, sobald Ihre Datenbankbefehle eine Transaktion erfordern, um zu verhindern, dass Ihre Datenbank inkonsistent ist . – moooeeeep

+0

@moooeeeep ja du hast Recht. Früher oder später verwenden wir das Verbindungsobjekt, um die Sql-Abfrage mit der Commit-Methode auszuführen. Daran hatte ich nicht gedacht. Danke für Ihre Hilfe. – amone

Antwort

0

WSGI-Anwendungen können durch mehrere Arbeitsprozesse und Threads bedient werden. Sie könnten also mehrere Threads mit derselben Verbindung verwenden. Sie müssen also herausfinden, ob die Implementierung der Verbindung Ihrer Bibliothek threadsicher ist. Schlagen Sie in der Dokumentation nach und prüfen Sie, ob sie angeben, Level 2 thread safety bereitzustellen.

Dann sollten Sie darüber nachdenken, ob Sie während Ihrer Anfragen Transaktionen benötigen. Wenn Sie feststellen, dass Sie Transaktionen benötigen (z. B. Anforderungen, die mehrere Datenbankbefehle mit einem inkonsistenten Status zwischen oder unter möglichen Wettlaufbedingungen ausgeben), sollten Sie andere Verbindungen verwenden, da Transaktionen immer verbindungsweit sind. Beachten Sie, dass einige Datenbanksysteme oder Konfigurationen keine Transaktionen unterstützen oder keine separaten Verbindungen voneinander isolieren.

Also, wenn Sie eine Verbindung teilen, sollten Sie davon ausgehen, dass Sie mit autocommit eingeschaltet (oder besser: das tatsächlich tun).

+0

Ich habe geplant, diese App mit Apache zu implementieren. In diesem Fall wird das Verbindungsobjekt von allen gleichzeitig benutzt. – amone

Verwandte Themen