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.
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"
Wo Sie Ihre Verbindung zur Datenbank herstellen, fügen Sie Folgendes hinzu.
conn = sqlite3.connect('your.db', check_same_thread=False)
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
engine = create_engine ('sqlite: ///restaurantmenu.db', connect_args = {'check_same_thread': falsch})
Funktioniert bei mir