You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+SQLite3预算追踪APP:如何更灵活存储SQL表参数?

更灵活的输入限制实现方案

方案一:新增SQL lookup表(推荐)

这是最贴合SQLite设计逻辑的方案,把固定的交易类型、账户、分类、货币都存到独立的配置表中,从数据库层面保障输入合法性:

  1. 创建配置表:
-- 交易类型表
CREATE TABLE IF NOT EXISTS TransactionTypes (
    type_id INTEGER PRIMARY KEY AUTOINCREMENT,
    type_name TEXT UNIQUE NOT NULL
);

-- 分类表
CREATE TABLE IF NOT EXISTS Categories (
    category_id INTEGER PRIMARY KEY AUTOINCREMENT,
    category_name TEXT UNIQUE NOT NULL
);

-- 账户表
CREATE TABLE IF NOT EXISTS Accounts (
    account_id INTEGER PRIMARY KEY AUTOINCREMENT,
    account_name TEXT UNIQUE NOT NULL
);

-- 货币表
CREATE TABLE IF NOT EXISTS Currencies (
    currency_id INTEGER PRIMARY KEY AUTOINCREMENT,
    currency_code TEXT UNIQUE NOT NULL
);
  1. 初始化固定数据:
def init_lookup_tables(cursor):
    # 插入预设交易类型
    cursor.executemany("INSERT OR IGNORE INTO TransactionTypes (type_name) VALUES (?)",
                       [('收入',), ('支出',), ('转账',)])
    # 插入预设分类(可根据需求调整)
    cursor.executemany("INSERT OR IGNORE INTO Categories (category_name) VALUES (?)",
                       [('餐饮',), ('工资',), ('房租',), ('交通',)])
    # 插入预设账户
    cursor.executemany("INSERT OR IGNORE INTO Accounts (account_name) VALUES (?)",
                       [('现金',), ('银行卡',), ('支付宝',)])
    # 插入预设货币
    cursor.executemany("INSERT OR IGNORE INTO Currencies (currency_code) VALUES (?)",
                       [('USD',), ('CNY',)])
  1. 输入校验逻辑:
def is_valid_category(cursor, category):
    cursor.execute("SELECT category_name FROM Categories WHERE category_name = ?", (category,))
    return cursor.fetchone() is not None

# 使用示例
if not is_valid_category(cursor, user_input_category):
    print('请选择预设分类中的选项')

核心优势:

  • 数据与代码解耦,后续调整固定选项无需修改业务代码,直接操作数据库即可
  • 可通过SQLite外键约束,强制Transactions表的关联字段必须来自配置表,从根源避免非法数据
  • 扩展性强,后续要给分类/账户添加额外属性(比如分类图标、账户余额上限),直接修改对应表结构就行

方案二:使用JSON配置文件

如果不想新增数据库表,用JSON文件存储固定选项是轻量替代方案:

  1. 创建config.json配置文件:
{
    "transaction_types": ["收入", "支出", "转账"],
    "categories": ["餐饮", "工资", "房租", "交通"],
    "accounts": ["现金", "银行卡", "支付宝"],
    "currencies": ["USD", "CNY"]
}
  1. 加载配置并校验:
import json

def load_app_config():
    with open('config.json', 'r', encoding='utf-8') as f:
        return json.load(f)

app_config = load_app_config()

# 分类校验示例
if user_input_category not in app_config['categories']:
    print('请选择预设分类中的选项')

核心优势:

  • 配置文件直观易读,修改无需操作数据库,适合快速调整
  • 无需额外数据库表结构,适合小型轻量化项目

缺点:

  • 只能在代码层面做校验,无法从数据库层面约束数据合法性
  • 配置文件若被误修改,可能导致非法数据流入

现有方案的问题与改进

你当前从Transactions表查询已存在分类的方式,存在两个明显缺陷:

  • 新用户首次使用时,Transactions表为空,没有可选分类
  • 若不慎插入错误分类,后续校验会将错误分类视为合法选项

上述两种方案都能解决这些问题,优先推荐SQL lookup表方案,尤其是对数据一致性要求高、需要长期维护的场景。

内容的提问来源于stack exchange,提问作者Jeffery-the-newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:52:08