我对编程很新。我之前尝试过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文件中的密码? 我该如何解决这个问题?
谢谢。
答案 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()