使用python 2.7函数查询sqlite3数据库



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

为了做到这一点,我有一个数据库,其中列出了每个城市和省份受教育程度最高的人的百分比。我为每个省份制作了一张表格:

数据库:

表:provision_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

我该如何计算?我该如何做才能使用户的输入不被视为字符串,从而在数据库中返回相同的字符串值?

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

首先,您应该将表合并为一个表,并添加一个名为province的列。这是有充分理由的。您不希望任何用户输入字段被调用为表名,因为您无法轻松地将其标记化(避免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(教育(向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_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字符串中(因为它返回相同的字符串(。

最新更新