main.py中的游标对象应由另一个模块中的函数访问

时间:2019-04-25 20:27:56

标签: python sqlite

我正在尝试通过python函数访问数据库,该函数仅需要我要插入数据库中的值。例如,我想在猫表中插入猫的名称和颜色,并且调用的函数应为insert_to_cat('felix', 'orange')

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

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

1 个答案:

答案 0 :(得分:0)

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

因此,不,一个模块中的全局变量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()

请注意:最好为每个查询创建一个新的游标。游标是给定查询及其结果的句柄。虽然可以重复使用游标(如果按顺序执行)是可以的,但是如果先使用游标选择一些行,然后获取其中的几行(但不是 all ),然后将游标用于第二行查询,第一个查询的行现在将消失。这很容易导致代码混乱和错误。