Исключение при попытке использовать пользовательскую функцию в sqlite3 с использованием Python - PullRequest
2 голосов
/ 29 мая 2011

Я использую Python 2.6.4 и его модуль sqlite3 для небольшого проекта базы данных, и у меня возникает следующая проблема: я пытаюсь использовать пользовательскую функцию, то есть функцию, которую вы определяете в Python для использовать после внутри ваших запросов. Функция является оберткой для другой функции, которую я имею в другом модуле. Проблема в том, что при выполнении запроса я всегда получаю исключение AttributeError с сообщением: 'builtin_function_or_method' объект не имеет атрибута 'execute' , и я понятия не имею, почему. Код следующий. Не могли бы вы указать мне, что я делаю не так?

Заранее спасибо.

Упаковщик Функция:

def SQLAreSimilar(userSelectedName, artistName):
    '''
    Wrapper to the areSimilar function of strUtils to use it directly inside the
    queries. Not to be called directly.
    '''
    if strUtils.areSimilar(userSelectedName, artistName):
        return 1
    else:
        return 0

Функция , которая фактически выполняет запрос. Обратите внимание на использование метода create_function объекта Connection.

def getArtistsBySimilarName(name):
    '''
    Returns all artists with a similar name, according to the Levenshtein
    distance. The DB is supposed to be initialised. Returns a dictionary of
    dictionaries with the data of all similar artists indexed by its CODARTIST,
    the PK. The dictionary is empty if no row is returned. None is returned on
    error.
    '''
    try:
        con = sqlite3.connect(genericConf.SQL_DBNAME)
        con.row_factory = sqlite3.Row
        con.create_function("ARESIMILAR", 2, SQLAreSimilar)
        cur = con.cursor
        rows = cur.execute(specificConf.SQL_SELECT_ARTIST_SIMILARNAME, name)
        retDict = {}
        for row in rows:
            d = {}
            d['NUMCD'] = row['NUMCD']
            d['NAME'] = row['NAME']
            retDict[row['CODARTIST']] = d
        return retDict
    except:
        return None

И, наконец, запрос . Он находится внутри модуля под названием «specificConf». Так что он правильно используется в функции выше, проблема не в этом.

SQL_SELECT_ARTIST_SIMILARNAME = u'''
SELECT  CODARTIST, NAME, NUMCD, ARESIMILAR(?, NAME) AS SIMILAR
FROM    ARTIST
WHERE   SIMILAR = 1  
'''

1 Ответ

2 голосов
/ 29 мая 2011
cur = con.cursor    # sets `cur` to a method

должно быть

cur = con.cursor()  # calls the method and sets `cur` to the return value

Вот почему вы получили сообщение о том, что cur не имеет атрибута execute:

Исключение AttributeError с сообщением: у объекта «builtin_function_or_method» нет атрибута «execute»

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