校验不过不落库

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

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

(这一节还有:valid_name(1~20 位、只字母数字)、valid_text(非空、≤200)、safe_add(校验不过不落库、交回 None)。)

正常一条、空文本、超长文本,各看 safe_add 返回和最终条数:

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 valid_name(name):
    """名字规则:1~20 个字符、只含字母数字。"""
    return 1 <= len(name) <= 20 and name.isalnum()


def valid_text(text):
    """正文规则:非空、不超过 200 字。"""
    return 0 < len(text) <= 200


def safe_add(conn, uid, text):
    """校验不过就不落库、交回 None;通过才插入、交回新 id。"""
    if not valid_text(text):
        return None
    cur = conn.execute("INSERT INTO notes(uid, text) VALUES(?, ?)", (uid, text))
    return cur.lastrowid

c = open_db()
a = safe_add(c, 1, "ok")
b = safe_add(c, 1, "")
d = safe_add(c, 1, "x" * 300)
print(str(a) + "/" + str(b) + "/" + str(d) + "/" + str(count_notes(c, 1)) if False else str(a) + "/" + str(b) + "/" + str(d))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论