2017-12-03 5 views
2

私はこの機能を実行するための正しいアイデアを持っていると思っていますが、なぜ私はそれをテストすると のエラーが出るのか分かりません。誰でもこの問題を解決するのを助けてくれますか?データベース内の学科コースを返す

cur.execute(q) 

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

現在の試行

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%')''') 

所望の出力

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',)] 

クエリ機能:

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 'からあるコースとは別のコースを選択

に評価すべき?'にSqliteステートメントは、具体的な値(通常、ステートメントを実行するときにパラメータとして追加される)で埋めなければならないプレースホルダーです。 –

+0

これを修正するにはどうすればよいですか? – bigez

+0

'? + '部分です。これは最善の方法ではありませんが、うまくいくはずです。 –

答えて

0

現在、プレースホルダを使用していますが、パラメータは渡していません。次に、プレースホルダー?を連結して、データ値をLIKEとします。

単に個別のクエリステートメントとデータ値と自身で?を残す:

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

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

私の編集でrun_query()を示しました。 – bigez

+0

私はrun_query()を見せてくれました。 – bigez

+0

提案したソリューションを実行しましたか? – Parfait

0

あなたはリストやタプルとして引数を渡す必要があり.executeを使用している間、ここではサンプル

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

があります?を削除しますか? deptが変数として扱われるようにsql構文を解決します。 SQLでは、この方法およびdeptでSQLインジェクションの影響を受けやすいかもしれ コースLIKE「mydept%」

注意がユーザ入力

+0

私はそのような列のdeptを言っているエラーを受け取ります – bigez

+0

私はあなたが使用している言語を知っていませんが、SQLで試してみればうまくいきます。あなたの文字列はSELECT DISTINCTコースになるはずですコースからどこに行く コースLIKE( 'mydepthere%') – gsilva2016

+0

私はPythonを使用しています。 – bigez

関連する問題