将不同表中的多个记录组合为一个字符串



我正试图使用studentID从一个表中获取他们的名字和姓氏,然后使用HomeworkID获取他们的一个作业的结果,并使用tkinter将结果显示在列表框小部件中。然而,在它可以显示之前,我首先需要能够获得数据。这就是我目前所拥有的:

def viewresults (self, sethw):
print (self.Homework_To_Set.get())
#resultslist = []
conn = sqlite3.connect('MyComputerScience.db')
c = conn.cursor()
homeworkID = c.execute("SELECT HWID FROM HomeworkInfo WHERE HomeworkName = ?", (self.Homework_To_Set.get(), )).fetchone()
studentsnamecheck = c.execute("SELECT StudentID FROM HomeworkSet WHERE  HWID = ?", ((homeworkID[0], ))).fetchall()
if len(studentsnamecheck) == 0:
self.View_Results.insert(END, "No one has completed this homework!")
else:
for x in studentsnamecheck:
c.execute("SELECT FName || ' ' || SName FROM users WHERE UserID = ?", (str(x), ))
res1 = (c.fetchall())
for i in (studentsnamecheck):
result_collect = c.execute("SELECT Results FROM HomeworkSet WHERE StudentID = ? AND HWID = ?", ((str(i)), self.Homework_To_Set.get() ))
var_insert_results = ((res1), (result_collect))
self.View_Results.insert(END, str(var_insert_results))

这是当前输出:

([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)
([], <sqlite3.Cursor object at 0x000001F40E1809D0>)

这是数据库的模式:

c.execute("""CREATE TABLE IF NOT EXISTS users (
UserID INTEGER PRIMARY KEY AUTOINCREMENT,
FName text,
SName text,
username text,
password text,
userType text,
ClassName text);""")
c.execute("""CREATE TABLE IF NOT EXISTS ClassInfo (
ClassID INTEGER PRIMARY KEY AUTOINCREMENT,
ClassName text,
Teacher text);""")
c.execute("""CREATE TABLE IF NOT EXISTS HomeworkInfo (
HWID INTEGER PRIMARY KEY,
HomeworkName text);""")

c.execute("""CREATE TABLE IF NOT EXISTS HomeworkSet (
HWID integer,
StudentID text,
Results text,
FOREIGN KEY (StudentID) REFERENCES users(UserID)
FOREIGN KEY (HWID) REFERENCES HomeworkInfo(HWID));""")

您的代码中存在以下几个问题:

c.execute("SELECT FName || ' ' || SName FROM users WHERE UserID = ?", (str(x), ))
res1 = (c.fetchall())
for i in (studentsnamecheck):
result_collect = c.execute("SELECT Results FROM HomeworkSet WHERE StudentID = ? AND HWID = ?",
((str(i)), self.Homework_To_Set.get() ))
  • users表中没有UserID字段;可能是username
  • str(x)应为x[0]
  • 应循环通过res1而不是studentsnamecheck
  • str(i)应为x[0]
  • self.Homework_To_Set.get()应为homeworkID[0]

所以代码应该是:

def viewresults(self, sethw):
print(self.Homework_To_Set.get())
conn = sqlite3.connect('MyComputerScience.db')
c = conn.cursor()
homeworkID = c.execute("SELECT HWID FROM HomeworkInfo WHERE HomeworkName = ?",
(self.Homework_To_Set.get(),)).fetchone()
studentsnamecheck = c.execute("SELECT StudentID FROM HomeworkSet WHERE HWID = ?",
(homeworkID[0],)).fetchall()
if len(studentsnamecheck) == 0:
self.View_Results.insert(END, "No one has completed this homework!")
else:
for x in studentsnamecheck:
c.execute("SELECT FName||' '||SName FROM users WHERE username = ?", (x[0],))
res1 = c.fetchall()
for i in res1:
results = c.execute("SELECT Results FROM HomeworkSet WHERE StudentID = ? AND HWID = ?",
(x[0], homeworkID[0])).fetchone()
self.View_Results.insert(END, '%-30s  %s'%(i[0], results[0]))

但是,您可以将SELECT语句组合成一个查询:

def viewresults(self, sethw):
conn = sqlite3.connect('MyComputerScience.db')
c = conn.cursor()
sql = """
SELECT SName||' '||FName, Results
FROM HomeworkSet, HomeworkInfo, users
WHERE HomeworkInfo.HomeworkName = ?
AND HomeworkInfo.HWID = HomeworkSet.HWID
AND HomeworkSet.StudentID = users.username
"""
c.execute(sql, (self.Homework_To_Set.get(),))
for result in c:
self.View_Results.insert(END, '%-30s  %s'%result)

最新更新