![](/img/trans.png)
[英]using python 2.7 to query sqlite3 database and getting “sqlite3 operational error no such table”
[英]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.