je suis assez nouveau en programmation. J'ai déjà essayé MySQL, mais c'est la première fois que j'utilise SQLite sur un site Web en flacon de python. Alors peut-être que j'utilise la syntaxe MySQL au lieu de SQLite, mais je n'arrive pas à trouver le problème.
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
Est-ce que cela signifie que je ne peux pas utiliser le nom, le nom d'utilisateur et le mot de passe de l'e-mail dans un fichier HTML? Comment résoudre ce problème?
Je vous remercie.
Votre curseur "c" n'est pas créé dans le même fil; il a probablement été initialisé lorsque l'application Flask est exécutée.
Vous souhaiterez probablement générer des objets SQLite (le connecteur et le curseur) dans la même méthode, tels que:
@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"
Lorsque vous vous connectez à la base de données, ajoutez ce qui suit.
conn = sqlite3.connect('your.db', check_same_thread=False)
Dans mon cas, j'ai le même problème avec deux fichiers python créant un moteur SQLite et fonctionnant donc éventuellement sur des threads différents. En lisant SQLAlchemy doc ici , il semble préférable d’utiliser la technique singleton dans les deux fichiers:
# maintain the same connection per thread
from sqlalchemy.pool import SingletonThreadPool
engine = create_engine('sqlite:///mydb.db',
poolclass=SingletonThreadPool)
Cela ne résout pas tous les cas, ce qui signifie que je reçois parfois la même erreur, mais je peux facilement la surmonter en rafraîchissant la page du navigateur. Puisque je ne l'utilise que pour déboguer mon code, c'est correct pour moi. Pour une solution plus permanente, vous devriez probablement choisir une autre base de données, telle que PostgreSQL ou une autre base de données.
engine = create_engine ('sqlite: ///restaurantmenu.db', connect_args = {'check_same_thread': false})
Travaille pour moi