【问题标题】:Combining multiple records from different tables into one string将不同表中的多条记录组合成一个字符串
【发布时间】:2020-06-29 20:44:29
【问题描述】:

我正在尝试使用 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));""")

【问题讨论】:

  • "current output: ... :你必须再次循环生成的.Cursor object
  • 您可以使用SQL JOIN 来组合三个SELECT 语句,这样您就可以使用一个for 循环来遍历结果。

标签: python sqlite tkinter


【解决方案1】:

您的代码中有几个问题:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2016-09-20
    • 2018-08-06
    相关资源
    最近更新 更多