![](/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.