我在这里已经阅读了其他几个类似的问题,但仍无法理解这一点。
我正在开发一个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}
答案 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)