无法使用 argparse 从 sqlite3 读取数据

如何解决无法使用 argparse 从 sqlite3 读取数据

我正在尝试创建一个模块来处理 sqlite3。我的程序包含两部分:

  1. 基础程序
  2. 命令行界面(使用 argparse)

这是我没有 CLI 的程序(它可以工作):

import argparse
from sqlite3 import Error,connect
import os

class db_connector:
    def __init__(self,path):
        self.path = path

    def create_connection(self):
        connection = None
        if os.path.exists(self.path):
            try:
                connection = connect(self.path)
                print('Connected to db successfuly.')
            except Error as e:
                print(f'Fail to connecting,the error {e} occured.')
        else:
            print('The path is not exists.')


        return connection

    def execute_query(self,connection,query):
        cursor = connection.cursor()
        try:
            cursor.execute(query)
            connection.commit()
        except Error as r:
            print(f'Can\'t execue the query,error {r} occured.')

    def read_query(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 部分:

# ------------------------------------ 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',type=str,nargs=2)
parser.add_argument('-r','--read-query',nargs=2)

args = parser.parse_args()

if args.connection_path != None:
    db = db_connector(args.connection_path)
    connection = db.create_connection()

if args.execute_query != None:
    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 != None: # Problem is here!!! 
    db = db_connector(args.read_query[0])
    connection = db.create_connection()
    query = args.read_query[1]
    print(db.read_query(connection,query))

要知道如何使用它,在终端中编写此命令就足够了:

program -h

Program 是我的 python 文件名称。 在我的数据库 db.sqlite3 中,我有一个带有名称、密码和许可证的服务器表。 当我写:

program -r db.sqlite3 "select * from servers"

我得到了:

Connected to db successfuly.
Traceback (most recent call last):
  File "G:\Programmng language\Python\Projects\Todo\server\db.py",line 67,in <module>
    print(db.read_query(connection,query))
TypeError: read_query() takes 2 positional arguments but 3 were given

请帮我解决这个问题。

解决方法

由于 read_query() 是一个类属性,Python 默认会将实例的引用传递给方法。

为了解决这个问题,您需要提供一个额外的参数来保存引用(通常称为 self),例如:

    def read_query(self,connection,query):
    # ...

或者,由于您不需要自我引用,请将其设为 staticmethod,即:

    @staticmethod
    def read_query(connection,query):
    # ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?