我一直在努力创建一个基本的应用程序来查询我拥有的记录数据库,以建议我接下来要听的内容。我当前的草稿要求用户输入他们正在收听的当前专辑,然后查询数据库以返回相关类型以及该类型中的其他艺术家。
我用来返回艺术家和流派的c.execute
和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
答案 0 :(得分:0)
我多次查看了我的代码并尝试设置变量genre_return = c.fetchone()[0]
。这似乎通过sqlite而不是之前传递的元组传递实际的表值。
我已经通过将genre_return
设置为基于genre.genre
的选择来测试此方法,如上所示以及genre.id
。查询在两种情况下都能成功运行。
我无法解释为什么 album_return = str(c.fetchone())
代码可以成功查询我genre_return
无法解决的数据库(作为元组)但我的问题似乎已经解决了。
这一直是学习经历。希望这可以帮助其他人尝试在python中使用sqlite。