将JSON响应数据插入SQLite3 DB

时间:2018-02-23 03:27:57

标签: python sqlite

我在这里已经阅读了其他几个类似的问题,但仍无法理解这一点。

我正在开发一个Flask应用程序,该应用程序根据我传入的硬币列表从API端点获取加密价格。然后我想在这个SQLite DB中存储每个硬币和价格:

drop table if exists prices;
create table prices (
  id integer primary key autoincrement,
  coin text not null,
  usd int not null
);

这是我的Flask路线和功能以及我的第一次尝试。所以在这里我将所有数据传递到字典中,然后尝试使用' db.executemany'将其放入数据库中。哪个没有用,并把错误扔到下面。

@app.route('/coindata')
def coindata():

coins = ['BTC', 'ETH', 'XRP', 'LTC', 'BCH', 'ADA', 'XLM', 'NEO', 'IOTA', 'DASH' ]

base_url = 'https://min-api.cryptocompare.com/data/price?fsym='
connector = '&tsyms='

fiat = 'USD'

coindata = {}

db = get_db()

for coin in coins:
    endpoint = base_url+coin+connector+fiat


    with urllib.request.urlopen(endpoint) as url:
        data = json.loads(url.read().decode())
        print(data) #returns {'USD': 9769.35}

        for k,v in data.items():
                price = v


        coindata.update({coin:v})


print(coindata)


db.executemany('insert into prices (coin, usd) values (?, ?)', (coindata,))
#sqlite3.ProgrammingError: Binding 1 has no name, but you supplied a dictionary (which has only names).

所以我想我需要打电话给' db.execute'在for循环中,然后从我的硬币列表中提交每个硬币加上返回到DB的USD价格,但我不知道如何实现它。

这是我在for循环中尝试过的:

with urllib.request.urlopen(endpoint) as url:
            data = json.loads(url.read().decode())
            print(data)

            db.execute('INSERT INTO prices (coin) VALUES (coin)')
            db.execute('INSERT INTO price (usd) VALUES (data[1])')

这会返回以下错误:

 db.execute('INSERT INTO prices (coin) VALUES (coin)')
sqlite3.OperationalError: no such column: coin

这很奇怪,因为我的架构中有硬币设置。

我也试过这个:

db.execute('INSERT INTO prices (coin, usd) VALUES (?,?)', coin, 
                data[1])

这会返回一个键错误

编辑:print(coindata)返回:

{'IOTA': 0.7129, 'BTC': 9825.56, 'NEO': 113.64, 'DASH': 609.78, 'ADA':    0.3068, 'LTC': 190.29, 'XLM': 0.3494, 'ETH': 835.72, 'XRP': 0.8966, 'BCH':    1178.76}

1 个答案:

答案 0 :(得分:3)

在sqlite3中executemany采用嵌套在列表

中的元组
data_coin = [(value1, value2), (value3, value4), ...]

因此,您可以通过创建一个空列表并向其附加元组来利用它。

coindata = []

with urllib.request.urlopen(endpoint) as url:
    data = json.loads(url.read().decode())
    print(data) #returns {'USD': 9769.35}

    for k,v in data.items():
            price = v
            coindata.apend((coin, v))

db.executemany('insert into prices (coin, usd) values (?, ?)', coindata)