![](/img/trans.png)
[英]Having trouble insert data from beautifulsoup4 into a sqlite3 db
[英]Insert JSON response data into SQLite3 DB
我在这里已经阅读了其他一些类似的问题,仍然无法理解这一点。
我正在使用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).
所以我想我需要在for循环中调用'db.execute',然后从我的硬币列表中提交每个硬币加上返回到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}
在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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.