首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python2.7函数查询sqlite3数据库

使用Python2.7函数查询sqlite3数据库
EN

Stack Overflow用户
提问于 2018-12-08 00:40:10
回答 2查看 50关注 0票数 0

我正在制作一个项目,人们通过提供他们的信息(教育,研究领域,获得的更高学位等)。都会给出一个分数。我使用的是sqlite3和Python2.7

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

数据库:

表: province_1

代码语言:javascript
复制
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

这就是我到目前为止得到的,但正如你所看到的,它是一个巨大的失败:

代码语言:javascript
复制
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

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

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

EN

回答 2

Stack Overflow用户

发布于 2018-12-08 01:01:54

首先,您应该将您的表合并为一个表,并添加一个名为省份的列。这是有充分理由的。您不希望将任何用户输入字段作为表名调用,因为您不能轻松地对其进行标记化(避免sql注入)。

其次,您正在将python代码与SQL语句合并,因此这永远不会起作用。

你需要的是这样的东西:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2018-12-20 23:15:50

我的答案

因此,我遇到的第一个问题是,我通过edu_score(教育)将另一个字符串添加到SELECT语句中,它只返回在DB中找到的字符串。另一个问题是,它没有根据用户的最高教育水平对必要的行进行求和。

答案是这样的:分割SELECT字符串,不要使用SUM,因为它是求和列而不是行。您只需要生成一个包含所有要添加的数据的字符串,即: SELECT (A +B+ C) FROM table WHERE ?,city,.

代码语言:javascript
复制
phrase = ''

我之所以设置这个变量,是因为在函数中它会返回'None‘

代码语言:javascript
复制
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语句中的值

代码语言:javascript
复制
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字符串中放入字符串时要小心(因为它会返回相同的字符串)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53673599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档