tara lara Ответов: 1

API не принимает входные данные


Привет. Я создаю базу данных с помощью SQLite. Затем мне нужно создать API с функциями, которые возвращают информацию об этой базе данных. Затем мне нужно распечатать отчет. Однако, когда я пытаюсь вернуть ответ на запрос с помощью входных данных, ничего не возвращается. Я либо получаю пустой массив, либо получаю "<sqlite3.cursor object="" at="" 0x034d2d20="">". Если я помещаю в запрос значения по умолчанию, а не входные данные, то возвращаются значения. Есть ли у кого-нибудь идеи о том, как я могу это исправить, пожалуйста (см. ниже для получения дополнительной информации)? Заранее благодарю вас!

Что я уже пробовал:

Вот код, который у меня есть до сих пор:

Это код, который создает базу данных....
import sqlite3

with sqlite3.connect('homework3.sq') as db:
    cursor = db.cursor()

cursor.execute(""" CREATE TABLE IF NOT EXISTS COURSES(
                    course_id       INTEGER              PRIMARY KEY,
                    department      varChar(100)         NOT NULL,
                    course_number   varChar(100)         NOT NULL,
                    course_name     varChar(100)         NOT NULL,
                    semester        varChar(100)         NOT NULL,
                    sem_year        varChar(20)          NOT NULL,
                    grade			varChar(1)			 Not NULL)""")

cursor.execute("""CREATE TABLE IF NOT EXISTS PREREQUISITE(
                course_id       INTEGER              PRIMARY KEY,
                prereq1		    Numeric(4)			 NOT NULL,
                prereq2			Numeric(4)			 NOT NULL,	
                ID REFERENCES COURSES("course_id")
                )""")


cursor.execute("""INSERT INTO COURSES (department, course_number, course_name, semester, sem_year, grade) VALUES 
                /*Sample Kpop Boy Bands- Present*/
                ('MATH', '1190', 'Calculus I', 'Summer', '2018', 'A'),
                ('CSE', '1322', 'Programming and Problem Solving', 'Fall', '2018', 'B'),
                ('CSE', '1322L', 'Programming and Problem Solving Lab', 'Fall', '2018', 'A'),
                ('CS', '3305', 'Data Structures', 'Spring', '2019', 'A'),
                ('CS', '3503', 'Computer Organization and Architecture', 'Spring', '2019', 'A'),  
                ('MATH','2202', 'Calculus II', 'Spring', '2019', 'B'),
                ('MATH', '2345', 'Discrete Mathematics', 'Fall', '2018', 'A'),
                ('CS', '3410', 'Introduction to Database Systems', 'Spring', '2020', 'A'),
                ('SWE', '3313', 'Introduction to Software Engineering', 'Spring', '2020', 'A'),
                ('CSE', '3801', 'Professional Practices and Ethics', 'Spring', '2020', 'A'),
                ('CS', '3502', 'Operating Systems', 'Fall', '2020', 'B'),
                ('CS', '4720', 'Internet Programming', 'Fall', '2020', 'A');""")

cursor.execute("""INSERT INTO PREREQUISITE(prereq1,prereq2) VALUES
                (0,0),
                (0,0),
                (0,0),
                (2,3),
                (2,3),
                (1,0),
                (0,0),
                (2,3),
                (2,3),
                (2,3),
                (4,5),
                (4,8)""")

db.commit()


Этот код находится в файле API. Этот код работает нормально:
def infoA():
    return cursor.execute("SELECT * FROM COURSES WHERE sem_year = 2018 AND semester = 'Fall'")


Но если я попытаюсь добавить параметры так, чтобы функция могла принимать входные данные (как показано ниже), я не получу ответа:
def infoB(year, sem):
    return cursor.execute("SELECT * FROM COURSES WHERE sem_year = ? AND semester = ?", [year, sem])


Вот также файл отчета:

import API
# print line to dive results
print("=" * 111)

template = "|{:<5} | {:15} | {:15}| {:40} | {:10}|{:5}| {:>5}|"  # Writes the instructions on how to format column title
# writes the first column of the report by writing that column one is
row = template.format("ID", "Department", "Course Number", "Course Name", "Semester", "Year", "Grade")
print(row)

# print line to dive results
print("=" * 111)

# Gets function from API. When I run this function I get this: "[]"
info = API.infoB(2018, 'FALL') 

# If I run this, it will return information
# info = API.infoA()  

# If I run this using infoB, I get "<sqlite3.Cursor object at 0x034D2D20>"
# print(infoB.fetchall()) 

for data in info:
    id = data[0]
    depart = data[1]
    num = data[2]
    name = data[3]
    sem = data[4]
    class_year = data[5]
    class_grade = data[6]
    print(template.format(id, depart, num, name, sem, class_year, class_grade))

# print line to dive results
print("=" * 111)

1 Ответов

Рейтинг:
12

Garth J Lancaster

В функции "инфоб" ,

def infoB(year, sem):
    return cursor.execute("SELECT * FROM COURSES WHERE sem_year = ? AND semester = ?", [year, sem])
почему существуют квадратные скобки [] вокруг параметров year,sem ? ...

Это так работает ?

def infoB(year, sem):
    return cursor.execute("SELECT * FROM COURSES WHERE sem_year = ? AND semester = ?", (year, sem))
?


tara lara

Привет. Хорошо, я попробовал это сделать, но он все еще не возвращает никаких значений. У кого-нибудь есть другие идеи?

Garth J Lancaster

Этот сайт предлагает вам использовать "именованные параметры" http://zetcode.com/db/sqlitepythontutorial/ - посмотрите на parameterized_query2.py

tara lara

Привет. Я заглянул на сайт. Я переписал эту функцию следующим образом:

ПОБ "инфоб" (году семьи):
возвращение курсора.выполнить("выбрать * из курсов, где sem_year = :год и семестр = :семь", {"год" год, "семь": семь})

Моя функция по-прежнему ничего не возвращает. Я попробовал сделать это вместо этого:

ПОБ "инфоб" (году семьи):
возвращение курсора.выполнить("выбрать * из курсов, где sem_year = :год и семестр = :семь ", {"год": uyear, "семь": усем})

Но я получаю ошибку с этим. Не могли бы Вы направить меня на другой сайт?

Garth J Lancaster

ты же понимаешь это

info = API.infoB(2018, 'FALL')
даст вам ноль/ничего возврата, верно ?? посмотрите на ваши данные "падение" против того, что вы ищете "падение".. вы должны быть немного точнее - компьютер может делать только то, что вы ему говорите, он не знает, что "падать" != "падать"

Я прогнал твой код с помощью
def infoB(year, sem):    return cursor.execute("SELECT * FROM COURSES WHERE sem_year = ? AND semester = ?", (year, sem))


и
info = API.infoB(2018, 'Fall')
и действительно получил правильный результат

tara lara

Большое вам спасибо!! Не могу поверить, что я не заметил эту ошибку в первый раз. Сожалеть об этом.

Maciej Los

5ed!