SQLite SELECT语句在Python

时间:2016-03-04 06:31:28

标签: python sqlite

我一直在努力创建一个基本的应用程序来查询我拥有的记录数据库,以建议我接下来要听的内容。我当前的草稿要求用户输入他们正在收听的当前专辑,然后查询数据库以返回相关类型以及该类型中的其他艺术家。

我用来返回艺术家和流派的c.executec.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 个答案:

答案 0 :(得分:0)

我多次查看了我的代码并尝试设置变量genre_return = c.fetchone()[0]。这似乎通过sqlite而不是之前传递的元组传递实际的表值。

我已经通过将genre_return设置为基于genre.genre的选择来测试此方法,如上所示以及genre.id。查询在两种情况下都能成功运行。

我无法解释为什么 album_return = str(c.fetchone())代码可以成功查询我genre_return无法解决的数据库(作为元组)但我的问题似乎已经解决了。

这一直是学习经历。希望这可以帮助其他人尝试在python中使用sqlite。