首页 > 解决方案 > main.py 中的游标对象应该由另一个模块中的函数访问

问题描述

我正在尝试通过 python-function 访问数据库,它只需要我想要插入数据库的值。例如,我想将我的猫的名字和颜色插入到我的猫表中,我调用的函数应该是insert_to_cat('felix', 'orange').

为了做到这一点,我insert_to_cat()在一个单独的模块中定义了 -function。我的意图是,我不必将光标作为附加参数传递给函数,因为如果我想多次调用该函数,那将是一件很痛苦的事情。我希望,因为我在主文件中创建了游标对象并调用了插入函数,所以游标对象实际上会在正确的范围内。不幸的是,情况并非如此,我收到以下错误: Name Error: name 'c' is not defined.

是否有可能在不将光标作为参数传递给函数的情况下实现我的目标?任何建议或解决方案表示赞赏。

标签: pythonsqlite

解决方案


全局名称是当前模块命名空间的一部分。函数存在于它们的模块命名空间中,而不是其他任何地方。否则,导入的函数将无法访问导入到定义它们的同一模块中的任何内容,或者它们的行为将完全改变,具体取决于它们被导入的位置。

所以不,一个模块中的全局变量c对于从另一个模块导入的函数是不可见的。

封装数据库功能的更好方法是使用一个类来对方法和状态(数据库连接、您在方法之间重用的任何游标等)进行分组。然后,当您为数据库创建一个实例时,这些方法都可以访问self并在那里找到重要的值,而调用代码不需要知道它是如何管理的:

class SomeClassName:
    def __init__(self, filename):
        self.connection = sqlite3.connect(filename)

    def some_method(self):
        with self.connection:
            cursor = self.connection.cursor()
            cursor.exeucte('SELECT some, column FROM some_table')
            for row in cursor:
                some_data_processing(row)

        return some_result

在需要使用结果的代码中,您只需要

some_variable = SomeClassName('....')
result = some_variable.some_method()

附带说明:最好为每个查询创建一个新游标。游标是给定查询和产生结果的句柄。虽然如果按顺序重复使用游标很好,但如果您首先使用游标选择一些行,然后获取其中一些(但不是全部)行,然后将游标用于第二个查询,第一个查询的行查询现在将消失。这很容易导致代码中的混乱和错误。


推荐阅读