【问题标题】:How to create a class which restricts methods based on the input file? Creating a database API如何创建一个基于输入文件限制方法的类?创建数据库 API
【发布时间】:2017-12-08 13:09:19
【问题描述】:

这个问题更多的是关于如何使用 OOP 读取数据库。 SQLite 和 sqlite3 只是可以使用的示例,并不是问题的主要内容。 (可以说Python在这里只是用来解释我的观点):

我正在创建一个软件包,它允许用户查询已经生成的 SQLite 索引文件。对于非常特殊的情况,查询以某种方式索引的 SQLite 文件基本上是一种语法,这应该很简单,但我有点困惑如何“自动”读取 SQLite

这是一个示例(带有伪代码):

import sqlite3

Class EasySQL:
    def __init__(self, filepath):
        self.filepath = filepath

    def connect(self, filepath):  ## perhaps this should be above in init?
        return sqlite3.connect(self.filepath)

    def query_indexA(self):
        ## query index A on SQLite3 connection

    def query_indexB(self):
        ## query index B on SQLite3 connection

    def query_indexC(self):
        ## query index C on SQLite3 connection

    def query_indexD(self):
        ## query index D on SQLite3 connection

这是我的问题:用户只能访问两种类型的索引 SQLite 文件。 “Type 1”文件仅在 A 和 B 上建立索引——索引 C 和 D 在此 SQLite 文件中不存在,如果用户尝试调用这些函数,应该会抛出错误。 “类型 2”文件仅在 C 和 D 上建立索引——该 SQLite 文件中不存在索引 A 和 B,如果用户尝试调用这些函数,应该会抛出错误。

我如何“限制”这些方法,以便如果用户在“Type 1”SQLite 文件上调用(例如)query_indexC,就会出现错误?

我强烈不希望强迫用户使用两个单独的类,因为这太复杂了,例如EasySQL_Type1()EasySQL_Type2() 一个标志,但哪种类型可以。

【问题讨论】:

  • 你如何确定什么是“Type 1”和什么是“Type 2”文件?
  • @zwer 用户必须在输入文件时。或者,在上面的示例中,找到的“错误”查询必须以某种方式抛出错误,即“错误:没有 B 索引”
  • 是的,但是如果你想根据类型抛出错误,你的班级需要知道哪个是哪个。这意味着用户需要告知您的班级所传递文件的类型,问题是 - 您如何想象这个过程?
  • @zwer 用户是生成“type1”sqlite 文件或“type2”sqlite 文件的用户。所以,如果他们记得,他们将是设置这个的人。但是,您是对的——可能存在人为错误。自动“检查”索引类型可能会更好

标签: python oop methods


【解决方案1】:

如果您可以正确识别文件类型,您可以轻松地将其存储为内部引用,并在尝试访问“无效”索引时抛出错误。您还可以在__init__() 中建立与您的 SQLite 文件的连接,因为没有网络驱动器,您不需要重新连接处理。

当然,也有边缘情况,但这应该可以帮助您入门:

import sqlite3

class EasySQL(object):

    def __init__(self, filepath, index_type=1):  # type 1 by default
        self.connection = sqlite3.connect(filepath)
        self.index_type = index_type

    def query_indexA(self):
        if self.index_type != 1:
            raise ValueError("indexA can only be queried by index type 1")
        # do your indexA processing... your DB is available in self.connection

    def query_indexB(self):
        if self.index_type != 1:
            raise ValueError("indexB can only be queried by index type 1")
        # do your indexB processing... your DB is available in self.connection

    def query_indexC(self):
        if self.index_type != 2:
            raise ValueError("indexC can only be queried by index type 2")
        # do your indexC processing... your DB is available in self.connection

    def query_indexD(self):
        if self.index_type != 2:
            raise ValueError("indexD can only be queried by index type 2")
        # do your indexD processing... your DB is available in self.connection

现在您的用户可以通过以下方式启动它:

type1_db = EasySQL("path/to/their/file.sqlite", 1)  # for type 1, or
type2_db = EasySQL("path/to/their/file.sqlite", 2)  # for type 2

如果他们尝试使用与其类型无关的方法,则会引发ValueError。如果您不想让用户提供他们的数据库文件的类型,则必须设计一种从文件本身(名称、架构等)来确定它的方法。

【讨论】:

  • 这对我来说很有意义。帮助我学习的问题:假设我们可以使用一些假设函数check_index() 在实例化时检查文件“类型”——假设存在这样的函数,上面将如何实现?
  • @EB2127 - 您始终可以创建此类函数并在连接到 SQLite DB 后立即调用它。假设它返回实际类型,您可以将其称为:self.index_type = self.check_index() 或类似的东西。这样您就无需依赖用户为您提供索引。
猜你喜欢
  • 2021-12-25
  • 2011-11-13
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多