【问题标题】:Can't read data from sqlite3 using argparse无法使用 argparse 从 sqlite3 读取数据
【发布时间】:2021-09-03 19:33:00
【问题描述】:

我正在尝试创建一个模块来处理 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', action='store', type=str, nargs=2)
parser.add_argument('-r', '--read-query', action='store', type=str, 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

请帮我解决这个问题。

【问题讨论】:

    标签: python sqlite cmd command-line-interface argparse


    【解决方案1】:

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

    为了解决这个问题,您需要提供一个包含引用的附加参数(通常称为self),例如:

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

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

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

    【讨论】:

    • 非常感谢。我犯了一个荒谬的错误。
    • 别担心,碰巧是最好的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多