2014-11-18 3 views
-1

Другой вопрос новичков Python, но я не могу найти ответ Googling. Что я делаю не так?AttributeError: объект 'tuple' не имеет атрибута 'getFieldByName'

for dbTrack in db.execute('SELECT * FROM tracks'): 
    genre = dbTrack.getFieldByName(genre) 
    artist = dbTrack.getFieldByName(artist) 
    album = dbTrack.getFieldByName(album) 
    title = dbTrack.getFieldByName(title) 

Traceback (most recent call last): 
    File "G:/personal/Python/Mp3Gen/test.py", line 207, in <module> 
    genre = dbTrack.getFieldByName(genre) 
AttributeError: 'tuple' object has no attribute 'getFieldByName' 

[Update] db от db = sqlite3.connect(SQLITE_DATABSE_NAME)

Как я могу идти о получении этих полей? dbTrack = {tuple}(None, 'The Verve Pipe', 'Villains', 'The Freshmen') Я просто использую dbTracks[0] и т. Д.?

Я согласен с @ abarnert, что это не хорошая практика. Я бы не сделать это на любом другом языке программирования, но, будучи настолько новым для Python, я не могу найти, как getFieldByName

+2

'dtTrack' является кортежем, а не тем, о чем вы думаете. Не зная, что такое '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' ''), вам трудно сказать больше, кроме этого, за исключением того, что вы, вероятно, –

+2

просто зарегистрируйте содержимое 'dbTrack', вы увидите, как он выглядит, и почему это не тот объект с этим методом, который вы хотите назвать – njzk2

+2

Почему, по вашему мнению, строки результатов SQL имели бы' getFieldByName() ' метод? Вероятно, вы можете просто использовать жанр, исполнителя, альбом, название = dbTrack. –

ответ

5

По умолчанию любой базы данных библиотека Python, который соответствует стандарту DB-API 2.0 даст вам какое-то последовательность для каждой строки, обычно кортеж или список. (В sqlite3, это кортеж.) Очевидно, вы не можете вызывать методы, такие как getFieldByName на кортеже или в списке.

Несмотря на то, что он не является частью стандарта, многие библиотеки предоставляют способ указать row_factory и могут предоставлять встроенные альтернативные фабрики строк. Например, sqlite3.Row позволяет получить к нему доступ, как если бы это был кортеж, или dict (используя имена столбцов в качестве ключей).

Так что, скорее всего, вы скопировали и вставили код из какой-либо другой программы, которая использует пользовательский тип строки, который имеет метод getFieldByName, но вы не скопировали код, который устанавливает этот настраиваемый тип строки в качестве фабрики строк.


Как примечание стороны, даже если вы это исправить, эта строка не будет работать:

genre = dbTrack.getFieldByName(genre) 

На данный момент, переменная genre либо не существует (в этом случае он поднимет UnboundLocalError или NameError) или имеет какое-то неуместное значение. Вы почти наверняка хотели буквальную строку 'genre'.


Если вы используете sqlite3, я думаю, вы бы гораздо лучше использовать встроенный в типа, чем некоторые пользовательского типа, это более многословным и не стандартизированы, где бы она приходит. Итак:

db.row_factory = sqlite3.Row 

# ... 

for dbTrack in db.execute('SELECT * FROM tracks'): 
    genre = dbTrack['genre'] 
    artist = dbTrack['artist'] 
    album = dbTrack['album'] 
    title = dbTrack['title'] 
Смежные вопросы