web-dev-qa-db-fra.com

ProgrammingError: les objets SQLite créés dans un thread ne peuvent être utilisés que dans ce même thread

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.

14
Tania

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"
13
ndrix

Lorsque vous vous connectez à la base de données, ajoutez ce qui suit.

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

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. 

2
ng10

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

Travaille pour moi

1
J J