簡體   English   中英

Python/sqlite3 function 比較:TypeError:'NoneType' object 不可下標

[英]Python/sqlite3 function compare : TypeError: 'NoneType' object is not subscriptable

我是新來的,有人可以幫幫我。 我正在開發一個組件比較器 webapp,第一頁正常工作,但是當我點擊“比較”(這將啟動 function 並顯示頁面)時,我只看到了“正文”,而不是 function 會做什么。 服務器不顯示錯誤消息。 當我嘗試在 VsCode 中手動啟動 function 時,出現此錯誤:

aprixProc1 = connexion.execute('SELECT prixProc FROM Processeur WHERE nomProc=(?);',(processeur1,)).fetchone()[0] 
TypeError: 'NoneType' object is not subscriptable

這是我的代碼:

import sqlite3
import cgi

formulaire = cgi.FieldStorage()
processeur1 = formulaire.getvalue('proc1')
processeur2 = formulaire.getvalue('proc2')

connexion = sqlite3.connect("composants.db")
connexion.execute("PRAGMA foreign_keys = ON")

#Recupere le prix de proc1 et proc2  
aprixProc1 = connexion.execute('SELECT prixProc FROM Processeur WHERE nomProc=(?);'(processeur1,)).fetchone()[0]
aprixProc2 = connexion.execute("SELECT prixProc FROM Processeur WHERE nomProc=(?);" (processeur2,)).fetchone()[0]


#Recupere le nb de coeurs de proc1 et proc2  
anbCoeurs1 = connexion.execute("SELECT coeursProc FROM Processeur WHERE nomProc=(?)", (processeur1,)).fetchone()[0]  
anbCoeurs2 = connexion.execute("SELECT coeursProc FROM Processeur WHERE nomProc=(?)",(processeur2,)).fetchone()[0]

#Recupere le nb de threads de proc1 et proc2  
athreadsProc1 = connexion.execute("SELECT threadsProc FROM Processeur WHERE nomProc=(?)",(processeur1,)).fetchone()[0]  
athreadsProc2 = connexion.execute("SELECT threadsProc FROM Processeur WHERE nomProc=(?)",(processeur2,)).fetchone()[0]  

#Recupere la taille de gravure de proc1 et proc2  
agravProc1 = connexion.execute("SELECT gravProc FROM Processeur WHERE nomProc=(?)",(processeur1,)).fetchone()[0]  
agravProc2 = connexion.execute("SELECT gravProc FROM Processeur WHERE nomProc=(?)",(processeur2,)).fetchone()[0]




pagedebut = '''
<html>
<head>

    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@600&display=swap" rel="stylesheet">
    <title> Components Stock Tracker </title>
    <link rel='stylesheet' href="css/fichier_css_html.css"/>
</head>

<body>
    <div class="entete">
        <p class='phead'>Components Stock Tracker</p>
        <img src ="images/logo_cst.jpg">
    </div>

    <div class="main">

'''

pagefin='''
</div>

    <div class="footer">
        <p class="texteFooter">
        Pied de Page <br> Crédits: Baptiste Lecerf </br>
        </p>
    </div>
</body>
</html> 
'''

def compareProc(prixProc1, prixProc2, nbCoeurs1, nbCoeurs2, threadsProc1, threadsProc2, gravProc1, gravProc2):    
reponse = ''  
if prixProc1 < prixProc2:  
    reponse += str(prixProc1)  
else:  
    reponse+= str(prixProc2)  
if nbCoeurs1 < nbCoeurs2:  
    reponse+= str(nbCoeurs2)  
else:  
    reponse+= str(nbCoeurs1)  
if threadsProc1 < threadsProc2:  
    reponse+= str(threadsProc2)  
else:  
    reponse+= str(threadsProc1)  
if gravProc1 < gravProc2:  
    reponse+= str(gravProc1)  
else:  
    reponse+= str(gravProc2)  

print(pagedebut+reponse+pagefin)

print(compareProc(aprixProc1, aprixProc2, anbCoeurs1, anbCoeurs2, athreadsProc1, athreadsProc2, agravProc1, agravProc2))  
connexion.close()

您可以通過一次查詢獲取所有值,當值的數量不重要時,獲取的數據庫越少越好。

  • 當您獲取一個屬性時,對於一行,您使用 used fetchone()[0] for: first row first field

  • 現在您獲取多個屬性,對於多行數據是這樣的

    [[450, 4, 8, 16] [550, 8, 1, 17]]
connexion = sqlite3.connect("composants.db")
cursor = connexion.cursor()
cursor.execute("PRAGMA foreign_keys = ON")

cursor.execute(
    'SELECT prixProc, coeursProc, threadsProc, gravProc FROM Processeur WHERE nomProc=? OR nomProc=?;',
    (processeur1, processeur2))
results = cursor.fetchall()

cursor.close()
connexion.close()

pagedebut = '''    '''
pagefin = '''    '''

def maxItem(values, index):
    return max(values, key=lambda x: x[index])[index]

def minItem(values, index):
    return min(values, key=lambda x: x[index])[index]

def compareProc(values):
    # min prixProc
    reponse = str(minItem(values, 0)) + " / "
    # max coeursProc
    reponse += str(maxItem(values, 1)) + " / "
    # max threadsProc
    reponse += str(maxItem(values, 2)) + " / "
    # min gravProc
    reponse += str(minItem(values, 3))

    return pagedebut + reponse + pagefin

print(compareProc(results))

不要print(method())如果method沒有返回任何東西,它會打印默認返回值的None ,要么做

method()

# OR the method must 'return' something
print(method()) 

以下 SQL 查詢可用於

'SELECT prixProc, coeursProc, threadsProc, gravProc FROM Processeur WHERE nomProc in (?, ?);'

我嘗試了這段代碼和其他一些東西,但我總是得到' [(0,)] '

(有括號?或沒有它是一樣的)

import sqlite3
import cgi

formulaire = cgi.FieldStorage()
#processeur1 = formulaire.getvalue('proc1')
processeur1 = "R5-3600"
#processeur2 = formulaire.getvalue('proc2')
processeur2 = "I9-10900K"

conn = sqlite3.connect("composants.db")
cursor = conn.cursor()
conn.execute("PRAGMA foreign_keys = ON")


sql = "select exists(SELECT prixProc, coeursProc, threadsProc, gravProc FROM Processeur WHERE nomProc= (?) OR nomProc= (?))"
args = (processeur1, processeur2)
cursor = conn.execute(sql, args)
results = cursor.fetchall()


pagedebut ='''

'''    

pagefin ='''    

'''

print(results)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM