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}
                      )

И это сработало!