2017-06-01 55 views
1

我在更新python循環中的sqlite3行時遇到問題。我試圖遍歷每一行,並更新一個特定的列。從該查詢...'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)進行比較時,它會中斷。

發生這種情況是因爲它認爲您的字符串值(row[0])實際上是一列。迫使它認識到它作爲一個字符串,改變這一行:

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

現在currency_name值是字符串逃過一劫,並會被正確識別。

+0

謝謝你抽出時間。現在我知道閱讀關於字符串轉義:) – BGroat