簡體   English   中英

使用python 2.7函數查詢sqlite3 DB

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM