将数据库查询中的字典/命名元组存储在Flask的会话对象中会引发“ TypeError:无法腌制sqlite3.Row对象”

时间:2019-11-07 13:25:55

标签: python sqlite dictionary session flask

与Flask一起进行我的第一个婴儿项目。这是一个游戏,我的目标是将用户当前的“实时游戏”和“团队”(组)存储在session-dict中,因此我不必在每次调用路由时都运行数据库查询(我可以不会想到以其他方式优雅地“集中”存储和传递这些数据)。

因此,我在第13和14行的代码“ new_game”(附加)中进行了此操作。get_db()函数(在此处找到:https://flask.palletsprojects.com/en/1.1.x/patterns/sqlite3/)返回一个namedtuple-还附加了它的实现。 / p>

这些行导致我的调试器转储“ TypeError:无法腌制sqlite3.Row对象”。现在,我怀疑问题可能在于命名元组为类型,并用dict()封装了get_db(),但这并没有改变。 在我看来,这是对有经验的人来说非常常见的解决方案,因此非常感谢...因此对此的任何帮助/提示/背景将不胜感激! ☺️

@app.route("/new_game", methods=["GET", "POST"])
@login_required
def new_game():
  # get group_name from form & initiating user's turn
  if request.method == "POST":
    group_name = request.form.get("group")
    row = query_db("SELECT * FROM groups WHERE group_name=? AND user_id=?",[group_name, session["user_id"]], one=True)

    # new DB entry for new game
    get_db().execute("INSERT INTO games (active, turn, group_name) VALUES (:active, :turn, :group_name)", {"active":1, "turn":row["turn"], "group_name":row["group_name"]})
    get_db().commit()
    #store user's live game and group in session
    session["game"] = query_db("SELECT * FROM games INNER JOIN groups ON groups.group_name=games.group_name INNER JOIN users ON users.user_id=groups.user_id WHERE users.user_id=? AND games.active=?", [session["user_id"], 1], one=True)
    session["gamegroup"] = query_db("SELECT * FROM groups INNER JOIN games ON games.group_name=groups.group_name INNER JOIN users ON groups.user_id=users.user_id WHERE groups.user_id=? AND games.active=?", [session["user_id"], 1], one=True)
    return render_template("live_game.html", turn=row["turn"], round=1, isturn=True, group_name=group_name)
  else:
    return redirect("/new_game")
###########################################

def get_db():
  db=getattr(g, '_database', None)
  if db is None:
    db = g._database = sqlite3.connect("ce.db")
    db.row_factory = sqlite3.Row
  return db

def query_db(query, args=(), one=False):
    cur = get_db().execute(query, args)
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv

0 个答案:

没有答案