将str连接到数据库以调用按钮插入中的两个ID时出现问题

2024-10-08 18:23:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了这两个函数,在curson.execute中添加了各种+:

def getIDCampionato(nome_campionato):
    cursor.execute('SELECT ID_Campionato FROM ARCHIVIO_Campionati WHERE Nome_Campionato = "' + nome_campionato + '";')
    result=[row[0] for row in cursor]
    return result

def getIDGiornata(id_campionato, giornata):
    cursor.execute('SELECT Numero_Giornata FROM ARCHIVIO_Giornate WHERE Relaz_Campionato = "' + id_campionato + '" AND Numero_Giornata = "' + giornata + '";')
    result=[row[0] for row in cursor]
    return result

但我得到了一个错误:

python TypeError: can only concatenate str (not "list") to str

错误:错误就在我写“+nome_campionato+”;”的地方以及“+id_campionato+”和numerio_Giornata=“”+Giornata+”;“。以前,当只有Select、From和Where(当还没有各种+)时,我没有发现错误,因此我相信sql是正确的

我该怎么办?这是不需要的,因为上面有错误,但是为了更好地完成问题,我添加了这段代码。这两个函数用于调用从sqlite数据库中提取的与每个对应giornata相关的锦标赛id(campionato)和giornata(回合)id(即每周一轮,内部有不同的比赛)。 为什么我要回忆这两个ID?因为有两个组合框:campionato(锦标赛)giornata(每个campionato/锦标赛38个)。这两个组合框是组合在一起的。我选择campionato(锦标赛),然后选择38轮中的一轮(giornata)。在每一轮中,空的,我可以插入不同的记录(下表“ARCHIVIO_Risultati”)。每一轮比赛将有38个不同的回合。因此,出于Sql标识的原因,我创建了上述两个函数。随后在此处调用它们,在“添加/添加”按钮的函数中调用它们,以在数据库中添加记录(通过手动编译textobox和combobx)

def add_employee():
    id_camp = getIDCampionato(combo_Campionato.get())
    id_giornata = getIDGiornata(id_camp, combo_Giornate.get())
    
    if combo_Campionato.get() == "" or combo_Giornate.get() == "" or  de.get() == "" or combo_Orario_Ora.get() == "" or combo_Orario_Minuti.get() == "" or combo_NomeSquadra_Casa.get() == "" or combo_NomeSquadra_Fuori.get() == "" or combo_Risultato_Sq_A.get() == "" or combo_Risultato_Sq_B.get() == "":
        messagebox.showerror("Error")
        return
    db.insert(id_camp, id_giornata, de.get(),combo_Orario_Ora.get(), combo_Orario_Minuti.get(), combo_NomeSquadra_Casa.get(), combo_NomeSquadra_Fuori.get(), combo_Risultato_Sq_A.get(), combo_Risultato_Sq_B.get())
    messagebox.showinfo("Record ok")
    clearAll()
    dispalyAll()

例如,我想通过两个campionato和giornata组合框获得:

Campionato: Serie A | Giornata 1 >>>>>> I insert various matches and info
Campionato: Serie A | Giornata 2 >>>>>> I insert various matches and info
Campionato: Serie A | Giornata ... >>>>>> I insert various matches and info
Campionato: Serie A | Giornata 38 >>>>>> I insert various matches and info

Campionato: Serie B | Giornata 1 >>>>>> I insert various matches and info
Campionato: Serie B | Giornata 2 >>>>>> I insert various matches and info
Campionato: Serie B | Giornata ... >>>>>> I insert various matches and info
Campionato: Serie B | Giornata 38 >>>>>> I insert various matches and info

为了更好地理解,以下是数据库表:

#Tournaments (Campionati)
CREATE TABLE "ARCHIVIO_Campionati" (
    "ID_Campionato" INTEGER, (example 435)
    "Nome_Campionato"   TEXT, (example Serie A)
    PRIMARY KEY("ID_Campionato" AUTOINCREMENT)
);

#Rounds (Giornate)
CREATE TABLE "ARCHIVIO_Giornate" (
    "ID_Giornata"   INTEGER,
    "Relaz_Campionato"  INTEGER, (example 435)
    "Numero_Giornata"   INTEGER, (1 to 38)
    FOREIGN KEY("Relaz_Campionato") REFERENCES "ARCHIVIO_Campionati"("ID_Campionato"),
    PRIMARY KEY("ID_Giornata" AUTOINCREMENT)
);

#Data to be saved in each of the 38 different rounds (Giornate). Each Tournaments consists of 38 rounds
CREATE TABLE "ARCHIVIO_Risultati" (
    "ID"    INTEGER,
    "campionato"    INTEGER,
    "giornate"  INTEGER,
    "calendario"    INTEGER,
    "ore"   NUMERIC,
    "minuti"    NUMERIC,
    "squadra_casa"  INTEGER,
    "squadra_fuori" INTEGER,
    "ris_sq_casa"   NUMERIC,
    "ris_sq_fuori"  NUMERIC,
    PRIMARY KEY("ID" AUTOINCREMENT)
);

您能告诉我如何更正问题开头的两个函数getIDCampionato和getIDGiornata吗?谢谢

enter image description here

enter image description here


Tags: orandidgetintegerinsertvariousmatches
1条回答
网友
1楼 · 发布于 2024-10-08 18:23:44

根据显示的第一个错误,确保未向这些函数传递列表:

[nome_campionato单个字符串]*不属于代码的一部分

[id_campionato&;giornata单个整数值]*不属于代码的一部分

import traceback

def getIDCampionato(nome_campionato):
    if isinstance(nome_campionato,str):
        try:
            query1 = "SELECT ID_Campionato FROM ARCHIVIO_Campionati WHERE Nome_Campionato = ?;"
            cursor.execute(query1, (nome_campionato,)) # if error, try passing these params in a list like -> [nome_campionato]
            result=[row[0] for row in cursor]
            return result
        except:
            print('Error generated for ->', nome_campionato, '\n')
            print(traceback.format_exc())
    else:
        print('This needs to be a string ->', nome_campionato)
        return 0

# as per the error generated this function should work fine, try it standalone
def getIDGiornata(id_campionato, giornata):
    if isinstance(id_campionato, int) and isinstance(giornata, int):
        query2 = "SELECT Numero_Giornata FROM ARCHIVIO_Giornate WHERE Relaz_Campionato = ? and Numero_Giornata = ?;"
        cursor.execute(query2, (id_campionato, giornata,)) # [id_campionato, giornata]
        result=[row[0] for row in cursor]
        return result
    else:
        print('Both need to be integer values -> id_campionato = ', id_campionato, ' || giornata = ', giornata)
        return 0

尝试上面更新的函数

它不打印的原因是我们直接确认了数据类型,所以这似乎是正确的,问题是其他的! 为了得到一个想法,我添加了更多的打印语句

我按照error resolution的建议添加了逗号

try分别调用函数getIDGiornata(id_campionato,giornata)查看它是否有效,如果无效,添加try-except块作为前一个函数并发布图像

相关问题 更多 >

    热门问题