SQLite数据库查询(Python, Bottle)

SQLite database query (Python, Bottle)

我正在尝试创建一个函数,其中 returns 登录用户的名称(如果可以识别)或 None(如果不能)。我想通过从 Bottle 请求中的 cookie 中查找会话 ID(如果存在),并使用它在会话 table.

中查找用户来实现此目的

到目前为止我的代码:

def session_user(db):
    """try to
    retrieve the user from the sessions table
    return usernick or None if no valid session is present
    """
    cursor = db.cursor()
    sessionid = bottle.request.get_cookie(COOKIE_NAME)
    usernick = None
    if sessionid:
        cursor.execute("SELECT usernick FROM sessions WHERE sessionid=?", (sessionid,))
        usernick = cursor.fetchall()
    return usernick

数据库中的table:

DROP TABLE IF EXISTS sessions;
CREATE TABLE sessions (
            sessionid text unique primary key,
            usernick text,
            FOREIGN KEY(usernick) REFERENCES users(nick)
);

当我在函数中使用当前代码时出现单元测试错误:

line 125, in test_session_user
    self.assertEqual(nick_from_cookie, None, "Expected None in case with invalid session id, got %s" % str(nick_from_cookie))
AssertionError: [] != None : Expected None in case with invalid session id, got []

参见cursor.fetchall documentation

Fetches all (remaining) rows of a query result, returning a list. Note that the cursor’s arraysize attribute can affect the performance of this operation. An empty list is returned when no rows are available.

由于 Python 中的空列表是一个 false-y 表达式,这通常效果很好 - 当不与 False/None 进行显式比较时。始终返回 a 列表还使迭代结果集(或检查长度)的代码更容易,因为不必完成 None 的特殊情况。

使用恰当命名的 fetchone 获得 单个 结果 记录 或 None.