2016-03-04 5 views
0

Я работаю над созданием базового приложения, которое запрашивает базу данных записей, которые у меня есть, чтобы предложить то, что я должен слушать дальше. Мой текущий проект требует, чтобы пользователь входил в текущий альбом, который они прослушивают, а затем запрашивает базу данных, чтобы вернуть родственный жанр и других художников в этом жанре.Оператор SQLite SELECT не работает в Python

Команды и c.fetchone(), которые я использую для возвращения художника и жанра дважды. Код не работает, когда я пытаюсь установить reclist = c.fetchall().

Худшая часть всего этого заключается в том, что у меня был код, работающий в течение нескольких минут, прежде чем вернуться и поработать несколькими вещами. Наверное, я выучил мой урок о внесении «безобидных» изменений.

схемы для базы данных:

sqlite> .schema 
CREATE TABLE album (
id INTEGER PRIMARY KEY, 
album TEXT 
); 
CREATE TABLE genre (
id INTEGER PRIMARY KEY, 
genre TEXT 
); 
CREATE TABLE artist (
id INTEGER PRIMARY KEY, 
artist TEXT 
); 
CREATE TABLE aag (
artist_id INTEGER, 
album_id INTEGER, 
genre_id INTEGER 
); 

Полный код Python ниже:

import sqlite3 
import sys 

conn = sqlite3.connect('aag_database.db') 
c = conn.cursor() 

print "Are you listening to a record right now?" 
uresponse1 = raw_input("[y/N]") 

#collect query information from user 
if uresponse1 == "N": 
    sys.exit() 

print "What is the name of the record are you listening to?" 
uresponse2 = raw_input("> ") 

print "Let me see what I know about %r" % (uresponse2) 

#query record database 
c.execute('''Select artist.artist FROM 
    artist, album, aag WHERE 
    artist.id=aag.artist_id AND 
    album.id=aag.album_id AND 
    album.album=?''', (uresponse2,)) 
artist_return = str(c.fetchone()) 

if artist_return == "None": 
    print "I guess I don't know anything about that record." 
    sys.exit() 

#confirm match 
print "Oh do you mean %r by %r" % (uresponse2, artist_return) 

uresponse3 = raw_input("[y/N]") 

if uresponse3 == "N": 
    sys.exit() 

#query record database for genre of user input 
c.execute('''Select genre.genre FROM 
    genre, album, aag WHERE 
    genre.id=aag.genre_id AND 
    album.id=aag.album_id AND 
    album=?''', (uresponse2,)) 
genre_return = str(c.fetchone()) 

if genre_return == "None": 
    print "I guess I don't know anything about that genre." 
    sys.exit() 

#confirm match 
print "I would classify that album as %r music" % (genre_return) 

print "If you like that you may also enjoy these records:" 

#query record database on genre 
c.execute('''Select artist, album FROM 
    genre, album, artist, aag WHERE 
    genre.id=aag.genre_id AND 
    album.id=aag.album_id AND 
    artist.id=aag.artist_id AND 
    genre.genre=?''', (genre_return,)) 
reclist = c.fetchall() 

print reclist 
+1

И урок для использования контроля версий, такого как 'git'! – ChrisFreeman

+1

Каково было сообщение об ошибке/stacktrace? – ChrisFreeman

+0

Не было сообщений об ошибке, которые являются частью того, что так расстраивает. Когда я печатаю список, я получаю значение None. Тест, который я использовал, имеет несколько других художников в одном жанре. Чтобы сделать это еще БОЛЕЕ, разочарование окончательный запрос работает, когда я выполняю его в sqlite3. – cmcfetridge

ответ

0

Я рассмотрел мой код несколько раз и попытался установить переменную genre_return = c.fetchone()[0]. Кажется, это возвращает фактическое значение таблицы обратно через sqlite, а не кортеж, который ранее был передан.

Я проверил этот метод, установив genre_return на выбор на основе genre.genre, как показано выше, а также genre.id. Запросы успешно работали в обоих случаях.

Я не могу объяснить, почему album_return = str(c.fetchone()) код может успешно запросов к базе данных (в виде кортежа), где мой genre_return не мог, но моя проблема, кажется, был решен.

Это был опыт обучения. Надеюсь, это поможет кому-то, кто пытается работать с sqlite в python.

+0

fetch one возвращает первый элемент коллекции как кортеж, поэтому [0] получает первый элемент кортежа. – cutzero

+0

Спасибо за объяснение! – cmcfetridge

Смежные вопросы