Хранение dicts / namedtuple из DB-запроса в объекте сеанса во Flask выдает «Ошибка типа: невозможно выбрать объекты sqlite3.Row» - PullRequest
0 голосов
/ 07 ноября 2019

Работаю над моим первым детским проектом с Flask. Это игра, и моя цель - сохранить текущие «живую игру» и «команду» (группу) в сессионном диктанте, поэтому мне не нужно запускать запрос DB каждый раз, когда вызывается маршрут (могуне думаю о каком-либо другом способе «централизованного» хранения и элегантной передачи этих данных).

Так что я делаю это в моем коде «new_game» (прилагается) в строках 13 и 14. Get_db ()функция (найдена здесь: https://flask.palletsprojects.com/en/1.1.x/patterns/sqlite3/) возвращает именованный кортеж - также приложил мою реализацию этого.

Эти строки привели к тому, что мой отладчик сбросил «TypeError: не могу выбрать объекты sqlite3.Row». ТеперьЯ подозревал, что, возможно, проблема связана с namedtuple как типом и инкапсулировал get_db () с помощью dict (), но это ничего не изменило. Мне кажется, что это обычное дело с очень очевидным решением для опытных людей ... Любая помощь / советы / справки по этому вопросу будет принята с благодарностью! 100

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...