Как использовать объект подключения MySQLdb в импортированной функции - PullRequest
1 голос
/ 08 февраля 2012

Нубишский вопрос, чтобы быть уверенным. Я попытался переместить некоторый общий код в отдельный модуль и использовать код в качестве импортированной функции. Код делает запрос MySQL через MySQLdb. Когда функция является частью основного скрипта, она работает просто отлично. Когда я импортирую функцию из отдельного модуля, функция завершается ошибкой, потому что объект курсора больше не определен. Есть ли способ импортировать функции без определения отдельного объекта курсора только для импортируемой функции?

Вот кодированный пример. Это работает:

import MySQLdb
#from mod2 import lookup_value

def get_db_connection(database_name):
    db = MySQLdb.connect('localhost', 'user', 'pswrd', database_name)
    cur = db.cursor()
    return db, cur

def lookup_value(user_name):
    query = "SELECT COUNT(*) FROM x_user_%s" % (user_name)
    cur.execute("%s" % (query))
    return cur.fetchone()

db_name = 'mg_test' # database name
user_name = 'test' # name of a specific table in the database

db, cur = get_db_connection(db_name)
value = lookup_value(user_name)

Когда я перемещаю код для lookup_value во второй файл и импортирую его ('из mod2 import lookup_value'), код завершается ошибкой, поскольку объект курсора не определен. Импортированная версия lookup_value работает, только если я создаю объект курсора для его использования. Это кажется очень неэффективным. Как лучше всего решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Это потому, что lookup_value ищет cur в файле, в который вы его импортируете. Вы можете поместить все это в класс.

class DB():
    def __init__(self,database_name):
        db = MySQLdb.connect('localhost', 'user', 'pswrd', database_name)
        self.cur = db.cursor()


    def lookup_value(self,user_name):
        query = "SELECT COUNT(*) FROM x_user_%s"
        self.cur.execute(query, (user_name,))
        self.result = self.cur.fetchone()
        return self.result

Теперь вы можете сделать

....
db = DB(db_name)
value = db.lookup_value(user_name)

при импорте БД from mod2 import DB последняя часть все равно должна работать.

Также обратите внимание на то, как я выполняю запрос в lookup_value, это обеспечивает очистку данных

1 голос
/ 08 февраля 2012

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

...