我正在制定一个程序,通过给人们信息(教育,学习领域,取得的更高学位等)给他们打分。我正在使用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中返回相同的字符串值?
非常感谢,我希望我足够清楚。
答案 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字符串中(因为它会返回相同的字符串)。