【问题标题】:How to fix ```TypeError: can't pickle _thread._local object``` when inserting data into database?将数据插入数据库时​​如何修复```TypeError: can't pickle _thread._local object```?
【发布时间】:2019-04-16 12:59:34
【问题描述】:

当尝试将用户名和密码插入 PostgreSQL 数据库表时,我收到以下错误:

TypeError
TypeError: can't pickle _thread._local objects

Traceback (most recent call last)
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\app.py", line 1816, in full_dispatch_request
return self.finalize_request(rv)
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\app.py", line 1833, in finalize_request
response = self.process_response(response)
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask\app.py", line 2114, in process_response
self.session_interface.save_session(self, ctx.session, response)
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\flask_session\sessions.py", line 355, in save_session
total_seconds(app.permanent_session_lifetime))
File "c:\users\alex\appdata\local\programs\python\python37-32\lib\site-packages\werkzeug\contrib\cache.py", line 839, in set
pickle.dump(value, f, pickle.HIGHEST_PROTOCOL)
TypeError: can't pickle _thread._local objects

我不确定这意味着什么,但假设这是导致问题的代码:

user_id = db.execute("INSERT INTO users (username, password) VALUES(:username, :password)", {"username": username, "password": password})

if not user_id:
   return render_template("error.html", message="username already taken")

# stores users id
session["user_id"] = user_id

return redirect("/")

我的数据库有三个字段:用户名(文本)、密码(文本)和user_id(整数)

在我的 python 文件中,application.py 使用以下代码将我的烧瓶应用程序连接到数据库。

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine)) 

【问题讨论】:

  • 请您提供更多信息,例如您正在使用哪个包以及如何连接到数据库。
  • 我已经在连接数据库的python文件中添加了代码
  • 从堆栈跟踪来看,此错误似乎与 flask-session 包有关,与您提供的数据库代码无关。
  • 我必须做些什么来解决这个问题?
  • 我又添加了一些 Python 代码

标签: python sql postgresql flask adminer


【解决方案1】:

我知道这已经很晚了,但以防万一有人仍然遇到这个问题,我想你忘了包括 fetchone()fetchall()。所以 user_id 行应该是user_id = db.execute("SELECT user_id FROM users WHERE username = :username", {"username": username}).fetchone() 或类似的东西,假设你对表中的每个用户都有一个唯一的用户ID。

同样,我相信您会希望在尝试将行插入表中的任何行之后运行db.commit()

会话行应为session["user_id"] = user_id[0]。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2016-12-11
    相关资源
    最近更新 更多