использование функции python 2.7 для запроса базы данных sqlite3 - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю программу, в которой люди, предоставляя информацию (образование, область обучения, высшее образование и т. Д.), Получают оценку.Я использую sqlite3 и Python 2.7

. Для этого у меня есть БД, в которой указаны каждый город и провинция с указанием процентной доли людей с высшим образованием.Я сделал одну таблицу для каждой провинции:

DB:

table: провинция_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     |  ...  

И тогда у меня есть моя функция.В нем я хотел бы рассчитать процент людей с более низким и равным уровнем образования / людей с высшим образованием.

Пример: если пользователь1 из города2 и имеет степень ученичества, он будет иметь вид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

Как рассчитать это?и как мне сделать так, чтобы ввод пользователя не воспринимался как строка, которая возвращает то же строковое значение в БД?

Большое вам спасибо, и я надеюсь, что я достаточно ясно.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

[МОЙ ОТВЕТ]

Итак, первая проблема, с которой я столкнулся, заключалась в том, что я добавлял еще одну строку в оператор SELECT через edu_score (education), которая возвращала только строку, найденную в БД.Другая проблема заключалась в том, что он не суммировал только необходимые строки, в зависимости от самого высокого уровня образования пользователя.

Ответ был таким: сегментируйте строку SELECT и не используйте SUM, так как это столбец суммирования, а не строки.Вам просто нужно создать строку, которая охватывает все данные, которые вы хотите добавить, например: SELECT (A + B + C) ИЗ таблицы WHERE?, [City,].

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 (потому что этовозвращает ту же строку).

0 голосов
/ 07 декабря 2018

Сначала вы должны объединить свои таблицы в одну и добавить столбец с названием провинций.Для этого есть веская причина.Вы не хотите, чтобы какое-либо поле ввода пользователя вызывалось как имя таблицы, так как вы не можете легко токенизировать его (избегайте внедрения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...