ProgrammingError:在线程中创建的SQLite对象只能在同一个线程中使用

时间:2018-01-12 00:52:18

标签: python mysql sqlite flask

我对编程很新。我之前尝试过MySQL,但现在它是我第一次在python烧瓶网站上使用SQLite。     所以也许我使用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文件中的密码? 我该如何解决这个问题?

谢谢。

6 个答案:

答案 0 :(得分:31)

在与数据库建立连接的位置添加以下内容。

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

答案 1 :(得分:17)

你的光标' 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 :(得分:5)

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

为我工作

答案 3 :(得分:3)

就我而言,我有两个问题,两个创建sqlite引擎的python文件,因此可能在不同的线程上运行。阅读SQLAlchemy文档here,似乎最好在两个文件中都使用单例技术:

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

它不能解决所有情况,这意味着我偶尔会遇到相同的错误,但是我可以轻松地克服它,刷新浏览器页面。由于我仅使用它来调试代码,因此对我来说这是可以的。要获得更永久的解决方案,可能应该选择其他数据库,例如PostgreSQL或其他数据库

答案 4 :(得分:2)

您可以尝试以下方法:

engine=create_engine('sqlite:///data.db', echo=True, connect_args={"check_same_thread": False})

对我有用

答案 5 :(得分:0)

我遇到了同样的问题,并通过在每次通话后关闭连接来解决此问题:

results = session.query(something, something).all()
session.close()