2017-12-03 1 views
2

Ich denke, ich habe die richtige Idee, um diese Funktion zu tun, aber ich bin mir nicht sicher, warum ich diesen Fehler bekomme, wenn ich es teste. Kann mir bitte jemand helfen, das zu beheben?Returning Abteilung Kurse in Datenbanken

cur.execute(q) 

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 0 supplied.

Aktuelle Versuch

def find_dept_courses(db, dept): 
'''Return the courses from the given department. Use the "LIKE" 
    clause in your SQL query for the course name.''' 
return run_query(db, '''SELECT DISTINCT Course FROM Courses WHERE 
         Course LIKE (? + 'dept%')''') 

Wunsch Ausgang

find_dept_courses('exams.db', 'BIO') 

# [('BIOA01H3F',), ('BIOA11H3F',), ('BIOB10H3F',), ('BIOB33H3F',), 
# ('BIOB34H3F',), ('BIOB50H3F',), ('BIOC12H3F',), ('BIOC15H3F',), 
# ('BIOC19H3F',), ('BIOC32H3F',), ('BIOC37H3F',), ('BIOC50H3F',), 
# ('BIOC58H3F',), ('BIOC59H3F',), ('BIOC61H3F',), ('BIOC63H3F',), 
# ('BIOD21H3F',), ('BIOD22H3F',), ('BIOD23H3F',), ('BIOD26H3F',), 
# ('BIOD33H3F',), ('BIOD48H3F',), ('BIOD65H3F',)] 

Abfragefunktion:

def run_query(db, q, args=None): 
"""(str, str, tuple) -> list of tuple 
Return the results of running query q with arguments args on 
database db.""" 

conn = sqlite3.connect(db) 
cur = conn.cursor() 
# execute the query with the given args passed 
# if args is None, we have only a query 
if args is None: 
    cur.execute(q) 
else: 
    cur.execute(q, args) 

results = cur.fetchall() 
cur.close() 
conn.close() 
return results 
+0

A '?' in Eine SQLite-Anweisung ist ein Platzhalter, der mit einem konkreten Wert gefüllt werden muss (normalerweise als Parameter bei der Ausführung der Anweisung angehängt). –

+0

Ok, wie kann ich das beheben? – bigez

+0

Versuchen Sie, die '? + 'Teil. Dies ist nicht der beste Weg, sollte aber funktionieren. –

Antwort

0

Momentan verwenden Sie einen Platzhalter, übergeben jedoch keine Parameter. Zweitens verketten Sie Platzhalter ? mit einem Datenwert in LIKE Ausdruck.

einfach separate Abfrage-Anweisung und Datenwert und lassen ? von selbst:

def find_dept_courses(db, dept): 
    sql = '''SELECT DISTINCT Course FROM Courses WHERE Course LIKE ?''' 

    return run_query(db, sql, args=(dept+'%',)) 
+0

Ich zeigte run_query() in meiner Bearbeitung. – bigez

+0

Ich zeige run_query() wie würden wir es jetzt machen? – bigez

+0

Haben Sie meine vorgeschlagene Lösung ausgeführt? – Parfait

0

Während .execute verwenden Sie das Argument als Liste oder Tupel übergeben müssen, hier ist die Probe

# This is the qmark style: 
cur.execute("insert into people values (?, ?)", (who, age)) 
-1

Entferne das ? und lösen Sie Ihre SQL-Syntax, so wird Abt wie eine Variable behandelt, z.B. SQL sollte

SELECT DISTINCT Kurs von Kursen bewerten, wo Course LIKE 'mydept%'

Hinweis Sie mit dieser Methode SQL-Injection anfällig sein können und dept ist von Benutzereingaben

+0

Ich bekomme eine Fehlermeldung, keine solche Spalte dept – bigez

+0

Ich weiß nicht, welche Sprache Sie verwenden, aber wenn Sie in SQL versucht es funktioniert. Ihre Zeichenfolge sollte SELECT DISTINCT Kurs von Kurse WHERE Kurs LIKE ('mydepthere%') – gsilva2016

+0

Ich verwende Python. – bigez