繁体   English   中英

使用python 2.7函数查询sqlite3 DB

[英]using python 2.7 function to query sqlite3 DB

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

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

D B:

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

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

首先,您应该将表合并为一个表,并添加一列名为“省”的列。 这有很强的理由。 您不希望将任何用户输入字段称为表名,因为您不容易将其标记化(避免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

[我的答案]

因此,我遇到的第一个问题是我正在通过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字符串中(因为它会返回相同的字符串) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM