使用python 2.7函数查询sqlite3 DB

时间:2018-12-07 16:40:10

标签: python database python-2.7 sqlite

我正在制定一个程序,通过给人们信息(教育,学习领域,取得的更高学位等)给他们打分。我正在使用sqlite3和Python 2.7

为此,我有一个数据库,其中列出了每个城市和省份,其中有最高人民教育程度的百分比。我为每个省做了一张桌子:

数据库:

表格:province_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中返回相同的字符串值?

非常感谢,我希望我足够清楚。

2 个答案:

答案 0 :(得分:0)

首先,您应该将表合并到一个表中,并添加一列名为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

答案 1 :(得分:0)

[我的答案]

所以我遇到的第一个问题是我通过edu_score(education)向SELECT语句中添加了另一个字符串,该字符串仅返回了在数据库中找到的字符串。另一个问题是,它并不能仅根据用户的最高学历来累加必要的行。

答案是这样的:将SELECT字符串分段并且不使用SUM,因为它是对列而不是行求和。您只需要创建一个包含要添加的所有数据的字符串,即:从表WHERE?,[city,]中选择(A + B + C)。

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_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是用于列的,因此,如果您只想要特定的行,只需将要添加的数据放入SELECT语句中,并小心将字符串放入SELECT字符串中(因为它会返回相同的字符串)。