Доступ к объекту курсора в main.py должен осуществляться функцией из другого модуля - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь получить доступ к базе данных с помощью функции python, которой нужны только значения, которые я хочу вставить в базу данных.В качестве примера, я хочу вставить имя и цвет моей кошки в мою кошачую таблицу, и функция, которую я вызываю, должна быть insert_to_cat('felix', 'orange').

. Для этого я определил insert_to_cat() -функция в отдельном модуле.Мое намерение состоит в том, чтобы мне не приходилось передавать курсор в качестве дополнительного аргумента функции, потому что это было бы болью в заднице, если я хочу вызвать функцию много раз.Я надеялся, что, поскольку я создал объект курсора и вызвал функцию вставки в главном файле, объект-курсор фактически будет в нужной области видимости.Unforunatley, это не тот случай, я получаю следующую ошибку: Name Error: name 'c' is not defined.

Есть ли возможность достичь моей цели, не передавая курсор в качестве аргумента функции?Любые предложения или решения приветствуются.

1 Ответ

0 голосов
/ 25 апреля 2019

Глобальные имена являются частью текущего пространства имен модуля . Функции живут в пространстве имен их модулей, а не где-либо еще. В противном случае импортированная функция не сможет получить доступ к чему-либо, что было импортировано в тот же модуль, в котором они определены, или их поведение полностью изменится в зависимости от того, куда они были импортированы.

Так что нет, глобальная переменная 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()

В качестве примечания: лучше создать новый курсор для каждого запроса. Курсор - это дескриптор для данного запроса и результатов, которые он производит. Хотя повторное использование курсора хорошо, если выполняется последовательно, если сначала вы используете курсор для выбора некоторых строк, а затем извлекаете несколько (но не все ) из этих строк, а затем используете курсор для второго запроса строки первого запроса теперь исчезнут. Это может легко привести к путанице и ошибкам в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...