基于Python argparse的SQLite文件追踪脚本:需新增查询与更新功能
解决方案:为文件追踪脚本添加查询与更新功能
1. 明确数据库表结构(适配现有逻辑)
先确保你的SQLite表支持多文件关联同一FfAMILY和FOLDER,示例建表语句:
CREATE TABLE IF NOT EXISTS file_tracker ( id INTEGER PRIMARY KEY AUTOINCREMENT, ffamily TEXT NOT NULL, folder TEXT NOT NULL, date TEXT NOT NULL, path TEXT NOT NULL, fname TEXT NOT NULL, chunks INTEGER, md5 TEXT, zip TEXT );
2. 扩展argparse支持子命令
将原有插入功能拆分为add子命令,新增query和update子命令,让命令行交互更清晰:
import argparse import sqlite3 def get_db_connection(): conn = sqlite3.connect('file_tracker.db') conn.row_factory = sqlite3.Row # 支持按字段名访问查询结果 return conn def main(): parser = argparse.ArgumentParser(description='文件追踪脚本 - 管理文件族、文件夹与文件信息') subparsers = parser.add_subparsers(dest='command', required=True) # 原有插入功能:add子命令 add_parser = subparsers.add_parser('add', help='添加新文件记录') add_parser.add_argument('-ff', '--ffamily', required=True, help='文件族名称') add_parser.add_argument('-f', '--folder', required=True, help='文件夹路径') add_parser.add_argument('-d', '--date', required=True, help='文件日期') add_parser.add_argument('-p', '--path', required=True, help='文件完整路径') add_parser.add_argument('-fn', '--fname', required=True, help='文件名') add_parser.add_argument('-c', '--chunks', type=int, help='文件分块数') add_parser.add_argument('-m', '--md5', help='文件MD5值') add_parser.add_argument('-z', '--zip', help='压缩包路径') # 新增查询功能:query子命令 query_parser = subparsers.add_parser('query', help='按文件族查询关联信息') query_parser.add_argument('-ff', '--ffamily', required=True, help='要查询的文件族名称') # 新增更新功能:update子命令(向指定文件族+文件夹添加新文件) update_parser = subparsers.add_parser('update', help='向指定文件族和文件夹添加新文件信息') update_parser.add_argument('-ff', '--ffamily', required=True, help='目标文件族名称') update_parser.add_argument('-f', '--folder', required=True, help='目标文件夹路径') update_parser.add_argument('-d', '--date', required=True, help='新文件日期') update_parser.add_argument('-p', '--path', required=True, help='新文件完整路径') update_parser.add_argument('-fn', '--fname', required=True, help='新文件名') update_parser.add_argument('-c', '--chunks', type=int, help='新文件分块数') update_parser.add_argument('-m', '--md5', help='新文件MD5值') update_parser.add_argument('-z', '--zip', help='新文件压缩包路径') args = parser.parse_args() conn = get_db_connection() cursor = conn.cursor() if args.command == 'add': # 原有插入逻辑 cursor.execute(''' INSERT INTO file_tracker (ffamily, folder, date, path, fname, chunks, md5, zip) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ''', (args.ffamily, args.folder, args.date, args.path, args.fname, args.chunks, args.md5, args.zip)) conn.commit() print(f"已添加文件记录:{args.fname}") elif args.command == 'query': # 按FfAMILY查询关联信息 cursor.execute(''' SELECT folder, date, fname, path, md5, chunks, zip FROM file_tracker WHERE ffamily = ? ORDER BY folder, date ''', (args.ffamily,)) records = cursor.fetchall() if not records: print(f"未找到文件族 {args.ffamily} 的相关记录") return print(f"文件族 {args.ffamily} 的关联信息:") print("-" * 80) print(f"{'文件夹':<20} {'日期':<15} {'文件名':<20} {'MD5':<32}") print("-" * 80) for row in records: print(f"{row['folder']:<20} {row['date']:<15} {row['fname']:<20} {row['md5']:<32}") # 如需展示更多字段,可自行扩展输出格式 elif args.command == 'update': # 向指定FfAMILY+FOLDER添加新文件记录 cursor.execute(''' INSERT INTO file_tracker (ffamily, folder, date, path, fname, chunks, md5, zip) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ''', (args.ffamily, args.folder, args.date, args.path, args.fname, args.chunks, args.md5, args.zip)) conn.commit() print(f"已向文件族 {args.ffamily} 的文件夹 {args.folder} 添加新文件:{args.fname}") conn.close() if __name__ == '__main__': main()
3. 功能使用示例
查询功能
python file_tracker.py query --ffamily "ProjectA"
输出指定文件族下所有关联的文件夹、文件日期、文件名、MD5等信息,按文件夹和日期排序。
更新功能
python file_tracker.py update --ffamily "ProjectA" --folder "/data/docs" --date "2024-05-20" --path "/data/docs/report_v2.pdf" --fname "report_v2.pdf" --md5 "a1b2c3d4e5f6g7h8i9j0"
向指定文件族的目标文件夹中添加一条新的文件记录。
4. 可选优化点
- 添加唯一约束(如
UNIQUE(ffamily, folder, fname)),防止同一文件重复插入,并处理sqlite3.IntegrityError异常。 - 扩展查询功能,支持按文件夹过滤,或导出结果为CSV/JSON格式。
- 将日期字段改为
DATE类型,支持更精准的时间范围查询。
内容的提问来源于stack exchange,提问作者voyager 1
相关产品推荐
相关产品推荐

