私はプログラミングが初めてです。私は以前に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ファイルで名前、メールのユーザー名、パスワードを使用できないということですか?これをどうやって解決しますか?
ありがとうございました。
カーソル '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"
データベースに接続する場所に、次を追加します。
conn = sqlite3.connect('your.db', check_same_thread=False)
engine = create_engine(
'sqlite:///restaurantmenu.db',
connect_args={'check_same_thread': False}
)
私のために働く
私の場合、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や他のデータベースなどの別のデータベースを選択する必要があります