it-swarm.com.de

ProgrammingError: In einem Thread erstellte SQLite-Objekte können nur in demselben Thread verwendet werden

ich bin ziemlich neu in der Programmierung. Ich habe MySQL schon einmal ausprobiert, aber jetzt verwende ich zum ersten Mal SQLite in einer Python-Flaschen-Website. Vielleicht verwende ich MySQL-Syntax anstelle von SQLite, aber ich finde das Problem nicht.

Piece of my code: 

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm(request.form)
    if request.method=='POST' and form.validate():
        name =  form.name.data 
        email = form.email.data
        username = form.username.data
        password = sha256_crypt.encrypt(str(form.password.data))

        c.execute("INSERT INTO users(name,email,username,password) 
        VALUES(?,?,?,?)", (name, email, username, password))

        conn.commit

        conn.close()

The error:
 File "C:\Users\app.py", line 59, in register c.execute("INSERT INTO users(name,email,username,password) VALUES(?,?,?,?)", (name, email, username, password))
 ProgrammingError: SQLite objects created in a thread can only be used in that 
 same thread.The object was created in thread id 23508 and this is thread id 
 22640

Bedeutet das, dass ich den Namen, den E-Mail-Benutzernamen und das Kennwort nicht in einer HTML-Datei verwenden kann? Wie löse ich das? 

Vielen Dank.

14
Tania

Ihr Cursor 'c' wird nicht in demselben Thread erstellt. Es wurde wahrscheinlich initialisiert, wenn die Flask-App ausgeführt wird.

Wahrscheinlich möchten Sie SQLite-Objekte (die Verbindung und den Cursor) mit derselben Methode generieren, z.

  @app.route('/')
  def dostuff():
    with sql.connect("database.db") as con:
      name = "bob"
      cur = con.cursor()
      cur.execute("INSERT INTO students (name) VALUES (?)",(bob))
      con.commit()
      msg = "Done"
13
ndrix

Wo Sie Ihre Verbindung zur Datenbank herstellen, fügen Sie Folgendes hinzu.

conn = sqlite3.connect('your.db', check_same_thread=False)
24
cmrussell

In meinem Fall habe ich dasselbe Problem mit zwei Python-Dateien, die eine sqlite-Engine erstellen und daher möglicherweise auf verschiedenen Threads arbeiten. Lesen von SQLAlchemy doc here , scheint es besser zu sein, die Singleton-Technik in beiden Dateien zu verwenden: 

# maintain the same connection per thread
from sqlalchemy.pool import SingletonThreadPool
engine = create_engine('sqlite:///mydb.db',
                poolclass=SingletonThreadPool)

Es löst nicht alle Fälle, was bedeutet, dass ich gelegentlich den gleichen Fehler bekomme, aber ich kann ihn leicht überwinden und die Browserseite aktualisieren. Da ich dies nur zum Debuggen meines Codes verwende, ist dies für mich in Ordnung. Für eine dauerhafte Lösung sollten Sie wahrscheinlich eine andere Datenbank wie PostgreSQL oder eine andere Datenbank wählen 

2
ng10

engine = create_engine ('sqlite: ///restaurantmenu.db', connect_args = {'check_same_thread': falsch})

Funktioniert bei mir

1
J J