使用argparse时无法从SQLite3读取数据的问题排查与修复请求
修复 SQLite3 Python 模块的
read_query 方法错误 这个错误的根源很明确:你的read_query是类的实例方法,但定义时没有包含第一个必填的self参数,导致调用时参数数量不匹配。
错误原因解析
当你通过类的实例(比如db.read_query(...))调用方法时,Python会自动把实例本身作为第一个参数传递给方法。而你原来的read_query方法定义是:
def read_query(connection, query):
这意味着当你执行db.read_query(connection, query)时,实际传递的参数是(db, connection, query)——总共3个参数,但方法只接受2个,所以抛出TypeError。
修复方案
只需要给read_query方法加上self作为第一个参数即可,修改后的方法定义如下:
def read_query(self, connection, query): cursor = connection.cursor() result = None try: cursor.execute(query) result = cursor.fetchall() return result except Error as e: print(f"Can't read data, error '{e}' occurred.")
额外优化建议
另外,你的CLI部分存在重复创建db_connector实例的问题——比如用户同时指定-db和-r参数时,会重复初始化连接。可以优化一下逻辑,避免重复操作:
# 优化后的CLI部分 parser = argparse.ArgumentParser(prog='db', description='SQLite DB handler') parser.add_argument('-db', '--connection-path', action='store', type=str) parser.add_argument('-x', '--execute-query', action='store', type=str, nargs=2, metavar=('DB_PATH', 'QUERY')) parser.add_argument('-r', '--read-query', action='store', type=str, nargs=2, metavar=('DB_PATH', 'QUERY')) args = parser.parse_args() # 统一处理连接逻辑 db = None connection = None if args.connection_path: db = db_connector(args.connection_path) connection = db.create_connection() # 执行查询 if args.execute_query: if not db: db = db_connector(args.execute_query[0]) connection = db.create_connection() query = args.execute_query[1] db.execute_query(connection, query) # 读取查询 if args.read_query: if not db: db = db_connector(args.read_query[0]) connection = db.create_connection() query = args.read_query[1] print(db.read_query(connection, query))
测试验证
修改后再执行你的测试命令:
program -r db.sqlite3 "select * from servers"
应该会正常输出查询结果,不再抛出错误。
内容的提问来源于stack exchange,提问作者mahdi paydarpuya
相关产品推荐
相关产品推荐

