2016-12-11 2 views
0

エラーメッセージが表示されるのはなぜですか?「文字列フォーマット中にすべての引数が変換されない」というエラーメッセージは何を意味しますか?

私のコード:

from flask import Flask, render_template, g, request, url_for 
import sqlite3 

app = Flask(__name__) 
app.database = 'cc.db' 

def connect_db(): 
    return sqlite3.connect(app.database) 

@app.route('/', methods=['GET', 'POST']) 
def index(): 
    posts = "0" 
    if request.method =='POST': 
     name = request.form['nm'] 
     g.db = connect_db() 
     cur = g.db.execute('SELECT * FROM sols WHERE name LIKE '%'', str(name,)) 
     posts = [dict(name=row[0], color=row[1], size=row[2], location=row[3]) for row in cur.fetchall()] 
     g.db.close() 

    return render_template('index.html', posts=posts) 

if __name__=='__main__': 
    app.run() 

私はjQueryを使ってオートコンプリート機能をやろうとしています。まず、私はdbにアクセスする必要があります。私は問題の原因を突き止めることはできません。

答えて

3

引用が間違っています。

'SELECT * FROM sols WHERE name LIKE '%'' 

%オペレータで区切られた2つの文字列です:次はない 1つの文字列です。

あなたは'SELECT * FROM sols WHERE name LIKE '%演算子を使用するためにはPythonを求めている、と文字列の%文字列補間を実行します。 に補間するプレースホルダはないが、補間する1つの値(空の文字列)があると、エラーが発生します。

あなたはダブル引用符を使用するか、または埋め込まれた引用符をエスケープする必要があります:

"SELECT * FROM sols WHERE name LIKE '%'" 

しかし、今、あなたはSQLパラメータのプレースホルダを持っていません。

cur = g.db.execute('SELECT * FROM sols WHERE name LIKE ?', (name + '%',)) 
ここ

?が追加さ% SQLのワイルドカードでnameパラメータに設定されている最初のパラメータで置き換えられます:あなたは値にあなたの%ワイルドカードを追加し、このようなプレースホルダを使用する必要があると思いますに。データベースドライバは、その文字列を適切に引用して処理します。

+0

を使用するか、または文字列エスケープを使用してください: 'WHERE name LIKE \'%\ '' –

+0

@ horst666:*または埋め込み引用符*からエスケープしてください。 –

+0

ありがとう、これは私に役立ちます! –

関連する問題