我正在制作一个项目,人们通过提供他们的信息(教育,研究领域,获得的更高学位等)。都会给出一个分数。我使用的是sqlite3和Python2.7
为此,我有一个DB,其中列出了每个城市和省份的教育程度最高的人的百分比。我为每个省做了一张表:
数据库:
表: 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我如何计算它?如何才能使用户的输入不被视为字符串,从而在数据库中返回相同的字符串值?
非常感谢,我希望我说得够清楚了。
发布于 2018-12-08 01:01:54
首先,您应该将您的表合并为一个表,并添加一个名为省份的列。这是有充分理由的。您不希望将任何用户输入字段作为表名调用,因为您不能轻松地对其进行标记化(避免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发布于 2018-12-20 23:15:50
我的答案
因此,我遇到的第一个问题是,我通过edu_score(教育)将另一个字符串添加到SELECT语句中,它只返回在DB中找到的字符串。另一个问题是,它没有根据用户的最高教育水平对必要的行进行求和。
答案是这样的:分割SELECT字符串,不要使用SUM,因为它是求和列而不是行。您只需要生成一个包含所有要添加的数据的字符串,即: SELECT (A +B+ C) FROM table WHERE ?,city,.
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 + " + " + phrasecity_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语句中,并且在SELECT字符串中放入字符串时要小心(因为它会返回相同的字符串)。
https://stackoverflow.com/questions/53673599
复制相似问题