使用python2.7函数查询sqlite3db

2024-06-26 17:45:07 发布

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

我正在做一个项目,人们通过提供他们的信息(教育、学习领域、获得的高等学位等)来获得分数。我正在使用sqlite3和Python2.7

为了做到这一点,我有一个数据库,其中每个城市和省都列出了人民教育的最高学位的百分比。我为每个省准备了一张桌子:

数据库:

表:省1

cities| no certificate| high school diploma| Apprenticeship| bachelor| etc..
city1 :     5         |        15          |     8         |   20    | ... 
city2 :     15        |        12          |     35        |   10    |  ...  
city3 :     1         |        35          |     3         |   8     |  ...  

然后我有我的功能。在这本书中,我想做的是计算受教育程度较低和平等的人/受教育程度较高的人的百分比。你知道吗

示例:如果user1来自city2,并且拥有学徒学位,则结果为62/38=1.63

这是我到目前为止得到的,但正如你所看到的,这是一个巨大的失败:

def edu_score(education, fos, province, city):
    edu_lvl = ['No_certificate', 'high_school_diploma', 'Apprenticeship', 'CEGEP', 'Bachelor Diploma', 'Master Diploma', 'Doctorate']
    score = 0 
    crsr.execute("SELECT (SUM([edu_lvl.index(ed):: -1]) / (SUM ([edu_lvl.index(ed)::])) FROM province_1 WHERE cities = city") 
    score = crsr.fetchone()         
    print score

我怎么计算?我该怎么做才能让用户的输入不被当作字符串,而在db中返回相同的字符串值呢?你知道吗

非常感谢你,我希望我说得够清楚。你知道吗


Tags: 数据库citycertificate百分比scoreeduhighcities
2条回答

[我的回答]

因此,我遇到的第一个问题是,我通过edu\u score(education)将另一个字符串添加到SELECT语句中,它只返回在DB中找到的字符串。另一个问题是,它并不是根据用户的最高教育水平,对必要的行求和。你知道吗

答案是这样的:将SELECT字符串分段,不要使用SUM,因为它是对列的求和,而不是对行的求和。您只需要创建一个包含所有要添加的数据的字符串,即:SELECT(a+B+C)FROM table WHERE?,[城市,]。你知道吗

phrase = ''

我创建这个变量是因为在函数中它将返回“None”

def city_result(base):   
    global phrase 
    edu_lvl = ['No_certificate', 'high_school_diploma', 'Apprenticeship', 'CEGEP', 'Bachelor', 'Master', 'Doctorate']
    for i in  edu_lvl[edu_lvl.index(base):: -1] :
        if edu_lvl.index(i) == 0:
            phrase = phrase + i
        else: 
            phrase = i + " + " + phrase

city\ u result是将放入要计数的SELECT语句中的内容

def edu_score(education, fos, province, city):
    global phrase
    score = 0 
    city_result(education)
    crsr.execute("SELECT (" + phrase + ") FROM ? WHERE cities = ?", [province, city,]) 
    score = crsr.fetchone()
    score = score / (100 - score)

唯一要记住的是SUM是for column,因此如果您只需要某一行,只需将要添加的数据放在SELECT语句中,并且小心地将string放在SELECT字符串中(因为它返回相同的字符串)。你知道吗

首先,您应该将表合并到一个表中,并添加一个名为provinces的列。这是有充分理由的。您不希望将任何用户输入字段作为表名调用,因为您不能轻松地将其标记化(避免sql注入)。你知道吗

其次,将python代码与SQL语句合并,这样就永远不会起作用。你知道吗

你需要的是这样的东西:

def edu_score(education, fos, province, city):
    score = 0
    crsr.execute('SELECT (SUM("no certificate"+"high school diploma"+"Apprenticeship") / (SUM ("Bachelor Diploma"+"Master Diploma"+"Doctorate")) FROM provinces WHERE cities = ? AND province = ?', city, province)
    score = crsr.fetchone()
    return score

更新时间: 要处理评分,应该使用python,而不是SQL。你知道吗

def edu_score(education, fos, province, city):
    eds = ['No_certificate', 'high_school_diploma', 'Apprenticeship', 'CEGEP', 'Bachelor Diploma', 'Master Diploma', 'Doctorate']
    ed_index = eds.index(education)
    crsr.execute('SELECT SUM("no certificate"), SUM("high school diploma"), SUM("Apprenticeship"), SUM ("Bachelor Diploma"), SUM("Master Diploma"), SUM("Doctorate") FROM provinces WHERE cities = ? AND province = ?',
        city, province)
    scores = crsr.fetchone()
    score = sum(scores[:ed_index])/sum(scores[ed_index:])
    return score

相关问题 更多 >