web-dev-qa-db-ja.com

ProgrammingError:スレッドで作成されたSQLiteオブジェクトは、同じスレッドでのみ使用できます

私はプログラミングが初めてです。私は以前にMySQLを試しましたが、今ではpython flaskウェブサイトでSQLiteを使用するのは初めてです。したがって、SQLiteの代わりにMySQL構文を使用しているのかもしれませんが、問題を見つけることができないようです。

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

これは、HTMLファイルで名前、メールのユーザー名、パスワードを使用できないということですか?これをどうやって解決しますか?

ありがとうございました。

25
Tania

カーソル 'c'は同じスレッドで作成されていません。おそらく、Flaskアプリの実行時に初期化されました。

次のような同じメソッドでSQLiteオブジェクト(接続子、カーソル)を生成することをお勧めします。

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

データベースに接続する場所に、次を追加します。

conn = sqlite3.connect('your.db', check_same_thread=False)
36
cmrussell
engine = create_engine(
'sqlite:///restaurantmenu.db',
connect_args={'check_same_thread': False}
)

私のために働く

8
J J

私の場合、2つのpythonファイルでsqliteエンジンを作成しているため、異なるスレッドで動作している可能性があります。 SQLAlchemy doc here を読んで、両方のファイルでシングルトン技術を使用する方が良いようです:

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

すべての場合を解決するわけではありません。つまり、同じエラーがときどき発生しますが、ブラウザーページを更新して簡単に解決できます。私はこれを使用してコードをデバッグするだけなので、これは問題ありません。より永続的なソリューションを得るには、おそらくPostgreSQLや他のデータベースなどの別のデータベースを選択する必要があります

3
ng10