Python+SQLite3预算追踪APP:如何更灵活存储SQL表参数?
更灵活的输入限制实现方案
方案一:新增SQL lookup表(推荐)
这是最贴合SQLite设计逻辑的方案,把固定的交易类型、账户、分类、货币都存到独立的配置表中,从数据库层面保障输入合法性:
- 创建配置表:
-- 交易类型表 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 );
- 初始化固定数据:
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',)])
- 输入校验逻辑:
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文件存储固定选项是轻量替代方案:
- 创建
config.json配置文件:
{ "transaction_types": ["收入", "支出", "转账"], "categories": ["餐饮", "工资", "房租", "交通"], "accounts": ["现金", "银行卡", "支付宝"], "currencies": ["USD", "CNY"] }
- 加载配置并校验:
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
相关产品推荐
相关产品推荐

