2017-06-01 16 views
1

sqlite3行をPythonループで更新する際に問題があります。私はすべての行をループし、特定の列を更新しようとしています。私のコードでは、このクエリ...'where currency_name = ' + row[0]からSQLITE3列名のWHEREステートメントを誤る

sqlite3.OperationalError: no such column: row[0] (value of it) 

しかし、私はこのエラーを取得しています。

私が間違っている文法だと思いますか?私はそれをサブステートメントに分割しようとしましたが、それもうまくいきませんでした。私のコードは以下の通りです。

import sqlite3 
import requests 

conn = sqlite3.connect('cryptoindex-holdings.db') 
cursor = conn.cursor() 

for row in conn.execute('SELECT * FROM currency'): 
    r = requests.get('https://api.coinmarketcap.com/v1/ticker/' + row[0] + '/?convert=CAD') 
    r = r.json() 

    market_cap = r[0]['market_cap_cad'] 
    sql = "UPDATE currency SET market_cap = " + market_cap + " WHERE currency_name = " + row[0] 

    cursor.execute(sql) 
    conn.commit() 

と私のDBスキーマは次のとおりです。

currency (
    currency_name TEXT, 
    market_cap REAL, 
    coin_price REAL, 
    coins_owned REAL 
); 

答えて

3

あなたのWHERE文で値をエスケープ文字列ではありません。あなたのコードは、タイプがREALなので、他の値に対しても動作します。ただし、currency_name列(タイプTEXT)と比較すると、それは破損します。

これは、文字列値(0​​)が実際に列であると考えているために発生します。今currency_name値が文字列のエスケープです

sql = "UPDATE currency SET market_cap = " + market_cap + " WHERE currency_name=" + row[0] 

sql = "UPDATE currency SET market_cap = {} WHERE currency_name = '{}'".format(market_cap, row[0]) 

に、かつ正しく認識されます。それを文字列として認識することを強制するには、この行を変更します。

+0

ありがとうございます。今私は文字列エスケープについて読むことを知っている:) – BGroat

関連する問題