ProgrammingError: объекты SQLite, созданные в потоке, могут использоваться только в том же потоке
Я новичок в программировании. Я уже пробовал MySQL раньше, но теперь я впервые использовал SQLite на веб-сайте флип-панели python. Возможно, я использую синтаксис MySQL вместо SQLite, но я не могу найти проблему.
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 файле? Как я могу это решить?
Спасибо.
Ответы
Ответ 1
Ваш курсор '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"
Ответ 2
Если вы подключаетесь к базе данных, добавьте следующее.
conn = sqlite3.connect('your.db', check_same_thread=False)
Ответ 3
engine = create_engine(
'sqlite:///restaurantmenu.db',
connect_args={'check_same_thread': False}
)
Работает для меня
Ответ 4
В моем случае у меня такая же проблема с двумя файлами python, которые создают SQL-движок и, следовательно, могут работать на разных потоках. Чтение SQLAlchemy doc здесь, кажется, лучше использовать технологию singleton в обоих файлах:
# maintain the same connection per thread
from sqlalchemy.pool import SingletonThreadPool
engine = create_engine('sqlite:///mydb.db',
poolclass=SingletonThreadPool)
Он не решает всех случаев, то есть я иногда получаю ту же ошибку, но я могу легко ее преодолеть, обновляя страницу браузера. Поскольку я использую это только для отладки своего кода, для меня это нормально. Для более постоянного решения, вероятно, следует выбрать другую базу данных, такую как PostgreSQL или другую базу данных
Ответ 5
Я также столкнулся с подобной проблемой при работе с CRUD-приложениями. Я сделал следующие изменения.
engine = create_engine( 'sqlite:///restaurantmenu.db',
connect_args={'check_same_thread': False}
)
И это сработало!