【问题标题】:Python/sqlite3 function compare : TypeError: 'NoneType' object is not subscriptablePython/sqlite3 函数比较:TypeError:'NoneType' 对象不可下标
【发布时间】:2021-07-20 15:53:26
【问题描述】:

我是新来的,有人可以帮帮我吗?我正在开发一个组件比较器 webapp,第一页正常工作,但是当我点击“比较”(这将启动该功能并显示该页面)时,我只看到“正文”而不是该功能会做什么。服务器不显示错误消息。当我尝试在 VsCode 中手动启动该功能时,出现此错误:

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()

【问题讨论】:

  • 这不是您从数据库中获取结果的方式,您是否至少阅读过一篇关于如何做到这一点的教程? sqlitetutorial.net/sqlite-python/sqlite-python-select
  • 这能回答你的问题吗? Python SQLite3 / Selecting rows from table
  • 同样不要做4个请求来获取同一行的一个属性,在一个请求中检索SELECT prixProc,coeursProc, threadsProc ,gravProc FROM Processeur WHERE nomProc=(?)
  • @azro 是的,但是之后我如何比较每个属性?
  • 无论您检索多少属性,或检索多少行,所有数据都在结果中,而不是只有一个元素的列表,而是多个元素的列表

标签: python database function sqlite web-applications


【解决方案1】:

您可以通过一次查询获取所有值,当值的数量不重要时,获取的数据库越少越好。

  • 当您获取一个属性时,对于一行,您使用 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 (?, ?);'

【讨论】:

  • 我试试你的代码,在前面添加:“import sqlite3 import cgi formulaire = cgi.FieldStorage() processeur1 = formulaire.getvalue('proc1') processeur2 = formulaire.getvalue('proc2') ”无论如何它都不起作用。 PS:我是初学者
  • 这里是错误: testCompareProc.py", line 70, in print(compareProc(results)) testCompareProc.py", line 60, in compareProc reponse = str(minItem(values, 0)) + " / " testCompareProc.py", line 56, in minItem return min(values, key=lambda x: x[index])[index] ValueError: min() arg is an empty sequence
  • 也许我应该向您解释一下我的项目,我正在开发一个 web 应用程序,主页分为 4 个(每个组件),我使用 php 下拉菜单来显示示例处理器和用户选择 2 然后单击比较并启动此功能。当您单击它时,它应该显示相同的页眉和页脚,中间是函数应该返回的内容,但即使使用您的函数,我也只有页眉、页脚和中间没有任何内容
  • 我尝试使用 processeur1 = "R5-3600" 和 processeur2 = "I9-10900K" 打印(结果),它们是我的数据库中的项目,但我得到一个空列表 []
  • @VorTekS 见stackoverflow.com/questions/45343175/… 你可以去掉括号,我没有看到它,因为我只是复制了你的代码,查看我对 SQL 查询的编辑
【解决方案2】:

我尝试了这段代码和其他一些东西,但我总是得到 ' [(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2019-08-12
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多