跑一遍完整小流程

👁️ 1 人浏览 💬 0 人评论 ❤️ 添加收藏

(每道题开头都有同一段:open_db() 建一个内存 SQLite 库、含 users / notes / files 三张表、交回连接;执行 SQL 用 conn.execute(SQL, 参数元组),取一行用 .fetchone()、取全部用 .fetchall()、新行主键用 .lastrowid。判题机自带 sqlite3。)

(这一节还有:add_note 插一条交回新 id、get_text 按 id 取正文、update_note 改、delete_note 删、list_texts 按 id 顺序取某人全部、count_notes 数条数。)

(每道题开头都有同一段:open_db() 建一个内存 SQLite 库、含 users / notes / files 三张表、交回连接;执行 SQL 用 conn.execute(SQL, 参数元组),取一行用 .fetchone()、取全部用 .fetchall()、新行主键用 .lastrowid。判题机自带 sqlite3。)

(这一节还有:hash_pw 把密码变定长摘要、register(名字 UNIQUE,重名交回 False)、login(名字在且密码摘要对上才 True)。)

注册、发两条、数一数、登录,一条龙:

import sqlite3


def open_db():
    """建一个内存 SQLite 库,含 users / notes / files 三张表,交回连接。"""
    conn = sqlite3.connect(":memory:")
    conn.execute("CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT UNIQUE, pw TEXT)")
    conn.execute("CREATE TABLE notes(id INTEGER PRIMARY KEY, uid INTEGER, text TEXT)")
    conn.execute("CREATE TABLE files(id INTEGER PRIMARY KEY, uid INTEGER, name TEXT, size INTEGER)")
    return conn


def add_note(conn, uid, text):
    """插一条留言,交回它的新 id(自增主键)。"""
    cur = conn.execute("INSERT INTO notes(uid, text) VALUES(?, ?)", (uid, text))
    return cur.lastrowid


def get_text(conn, nid):
    """按 id 取一条留言的正文;没有交回 None。"""
    row = conn.execute("SELECT text FROM notes WHERE id=?", (nid,)).fetchone()
    return row[0] if row else None


def update_note(conn, nid, text):
    """把某条留言的正文改掉。"""
    conn.execute("UPDATE notes SET text=? WHERE id=?", (text, nid))


def delete_note(conn, nid):
    """删掉某条留言。"""
    conn.execute("DELETE FROM notes WHERE id=?", (nid,))


def list_texts(conn, uid):
    """按 id 顺序交回某人所有留言正文的列表。"""
    return [r[0] for r in conn.execute("SELECT text FROM notes WHERE uid=? ORDER BY id", (uid,))]


def count_notes(conn, uid):
    """数某人有几条留言。"""
    return conn.execute("SELECT COUNT(*) FROM notes WHERE uid=?", (uid,)).fetchone()[0]


import hashlib


def hash_pw(pw):
    """把明文密码变成定长摘要(不明文存库)。"""
    return hashlib.sha256(pw.encode()).hexdigest()[:16]


def register(conn, name, pw):
    """注册:名字 UNIQUE,重名交回 False,成功交回 True。"""
    try:
        conn.execute("INSERT INTO users(name, pw) VALUES(?, ?)", (name, hash_pw(pw)))
        return True
    except sqlite3.IntegrityError:
        return False


def login(conn, name, pw):
    """登录:名字存在且密码摘要对上才交回 True。"""
    row = conn.execute("SELECT pw FROM users WHERE name=?", (name,)).fetchone()
    return row is not None and row[0] == hash_pw(pw)

c = open_db()
register(c, "amy", "pw")
add_note(c, 1, "a"); add_note(c, 1, "b")
print(str(count_notes(c, 1)) + "/" + str(login(c, "amy", "pw")))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论