如何将Python命令行参数写入SQLite指定列,实现多用户数据查询?
解决Python脚本将命令行参数写入SQLite数据库的问题
先修正你代码中的核心问题,再给出完整可行版本:
原代码的主要问题:
- 创建表的SQL语句末尾多了逗号,导致语法错误
InsertToTable函数的SQL执行写法错误,且未传入正确参数- 遍历命令行参数的逻辑冗余,无需逐个判断参数名
- 参数为空的判断逻辑错误,
arg是参数名永远不会为None,应该判断参数值
修改后的完整代码:
import argparse import sys import sqlite3 def main(): # 创建解析器 parser = argparse.ArgumentParser(description="收集用户背景信息并写入SQLite数据库") # 添加命令行参数 parser.add_argument("--EDUCATIONLEVEL", help="用户的教育水平,对应数据库EDUCATIONLEVEL列") parser.add_argument("--INSTITUTION", help="用户就读的院校,对应数据库INSTITUTION列") parser.add_argument("--FIELD", help="用户的专业领域,对应数据库FIELD列") parser.add_argument("--DATE", help="获得学位的年份,对应数据库DATE列(建议输入整数)") parser.add_argument("--CAREER", help="用户当前职业,对应数据库CAREER列") # 解析参数 args = parser.parse_args() # 数据库连接 conn = sqlite3.connect("Background.db") cur = conn.cursor() # 创建表函数 def CreateTable(): # 移除最后一列后面的多余逗号 cmd = """CREATE TABLE IF NOT EXISTS BACKGROUND (EDUCATIONLEVEL TEXT, INSTITUTION TEXT, FIELD TEXT, DATE INTEGER, CAREER TEXT)""" cur.execute(cmd) conn.commit() # 插入数据函数,接收参数值 def InsertToTable(edu_level, institution, field, date, career): # 将SQL语句和参数分开传递给execute cmd = """INSERT INTO BACKGROUND(EDUCATIONLEVEL, INSTITUTION, FIELD, DATE, CAREER) VALUES (?, ?, ?, ?, ?)""" cur.execute(cmd, (edu_level, institution, field, date, career)) conn.commit() # 创建表 CreateTable() # 如果没有传入任何参数,显示帮助信息 if len(sys.argv) < 2: parser.print_help() conn.close() sys.exit() # 获取所有参数的值,空参数会是None edu_level = args.EDUCATIONLEVEL institution = args.INSTITUTION field = args.FIELD date = args.DATE career = args.CAREER # 插入数据到数据库 InsertToTable(edu_level, institution, field, date, career) # 关闭连接 conn.close() print("数据已成功写入数据库") if __name__ == "__main__": main()
关键修改说明:
- 创建表的SQL修正:移除了
CAREER TEXT后面的逗号,避免SQL语法错误 - 插入函数优化:
- 把参数作为函数参数传入,避免未定义变量的问题
- 将SQL语句和参数列表作为两个独立参数传给
cur.execute(),这是SQLite参数化查询的正确写法 - 移除了
INSERT OR IGNORE(如果需要避免重复数据,可根据实际需求添加,比如给表指定唯一约束)
- 参数处理逻辑简化:直接通过
args.参数名获取对应值,不需要遍历参数名逐个判断 - 参数空值处理:SQLite会自动将
None存储为NULL,如果需要强制某些字段必填,可以在插入前添加判断,比如:if not edu_level: print("错误:必须提供--EDUCATIONLEVEL参数") sys.exit(1) - 帮助信息触发逻辑修正:
sys.argv至少包含脚本名,所以当长度小于2时说明没有传入任何参数,此时显示帮助并退出
使用示例:
python your_script.py --EDUCATIONLEVEL 硕士 --INSTITUTION 清华大学 --FIELD 计算机科学 --DATE 2023 --CAREER 软件工程师
后续查询扩展(按INSTITUTION维度查询):
可以添加查询功能,比如新增一个--QUERY参数,指定查询的院校:
# 添加查询参数 parser.add_argument("--QUERY", help="按院校查询用户信息,输入院校名称") # 在解析参数后添加查询逻辑 if args.QUERY: cmd = "SELECT * FROM BACKGROUND WHERE INSTITUTION = ?" cur.execute(cmd, (args.QUERY,)) results = cur.fetchall() if results: print(f"查询到{len(results)}条来自{args.QUERY}的记录:") for row in results: print(row) else: print(f"未找到来自{args.QUERY}的记录") conn.close() sys.exit()
内容的提问来源于stack exchange,提问作者voyager 1
相关产品推荐
相关产品推荐

