python - peewee: ValueError('Missing value for %s.' % column.name) on insert_many bulk insert
问题描述
更新
@coleifer 指出了我的错误:
.insert_many(data)
是正确的,.insert_many([data])
不是。
原来的
我不确定为什么insert_many
认为缺少值。的输出data
向我表明价值就在那里。
data
是一个字典列表。我对文档进行了解释,认为这是insert_many
.
我们可以通过使用 insert_many() 获得另一个巨大的提升。此方法接受元组或字典列表,并在单个查询中插入多行:
下面的代码是我正在使用的。我已经进行了更改以尝试使用float(ticker['v'])
,因此它与表的定义一致。我还尝试weight
用虚拟填充列,int
以便填充所有字段,尽管weight
列有null
约束。在任何一种情况下,我仍然遇到同样的错误。这些更改没有反映在下面的代码中,因为它们没有更改错误或解决问题。
代码
def ticker_stream(stream):
print(f"stream:\n{stream}")
""" upsert Ticker data from stream """
data = []
for ticker in stream:
for symbol in vars.symbol_ids:
if symbol['name'] == ticker['s']:
symbol_id = symbol['id']
data.append({'symbol_id': symbol_id, 'weighted_average_price': ticker['w'], 'total_traded_base_asset_volume': ticker['v'], 'total_traded_quote_asset_volume': ticker['q']})
try:
print(f"data:\n{data}")
insert_query = (c_db.Tickers
.insert_many([data])
.on_conflict(
conflict_target = [ c_db.Tickers.symbol ],
preserve = [ c_db.Tickers.symbol ],
update = [data]
)
.execute()
)
except PeeweeException as e:
logging.exception(f"{e}")
桌子
In [1]: from playhouse.reflection import print_model
In [2]: print_model(c_db.Tickers)
tickers
id AUTO PK
symbol INT FK: Symbols.id
weighted_average_price FLOAT
total_traded_base_asset_volume FLOAT
total_traded_quote_asset_volume FLOAT
weight INT
index(es)
symbol_id
In [3]:
输出
stream:
[{'e': '24hrTicker', 'E': 1633019418650, 's': 'IOTXUSDT', 'p': '0.00216', 'P': '3.703', 'w': '0.06190', 'c': '0.06049', 'Q': '111', 'o': '0.05833', 'h': '0.06525', 'l': '0.05651', 'v': '1066120847', 'q': '65989958.82000', 'O': 1632933000000, 'C': 1633019418644, 'F': 11822513, 'L': 12020549, 'n': 198035}, {'e': '24hrTicker', 'E': 1633019419094, 's': 'BTCUSDT', 'p': '1361.38', 'P': '3.278', 'w': '42677.07', 'c': '42898.31', 'Q': '0.001', 'o': '41536.93', 'h': '43822.85', 'l': '40887.00', 'v': '365499.423', 'q': '15598442675.21', 'O': 1632933000000, 'C': 1633019419087, 'F': 1489633272, 'L': 1493071304, 'n': 3438004}, {'e': '24hrTicker', 'E': 1633019419046, 's': 'ETHUSDT', 'p': '116.83', 'P': '4.101', 'w': '2941.85', 'c': '2965.69', 'Q': '0.543', 'o': '2848.86', 'h': '3049.30', 'l': '2780.00', 'v': '2191345.813', 'q': '6446606858.84', 'O': 1632933000000, 'C': 1633019419039, 'F': 1103292619, 'L': 1106186143, 'n': 2893515}, {'e': '24hrTicker', 'E': 1633019418296, 's': 'BCHUSDT', 'p': '8.51', 'P': '1.754', 'w': '491.10', 'c': '493.77', 'Q': '0.074', 'o': '485.26', 'h': '506.13', 'l': '471.14', 'v': '280920.032', 'q': '137960347.52', 'O': 1632933000000, 'C': 1633019418289, 'F': 237467951, 'L': 237775138, 'n': 307187}, ... # omitted for brevity ... ]
data:
[{'symbol_id': 25930, 'weighted_average_price': '42677.07', 'total_traded_base_asset_volume': '365499.423', 'total_traded_quote_asset_volume': '15598442675.21'}, {'symbol_id': 25931, 'weighted_average_price': '2941.85', 'total_traded_base_asset_volume': '2191345.813', 'total_traded_quote_asset_volume': '6446606858.84'}]
Exception in thread parser:
Traceback (most recent call last):
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 2673, in _generate_insert
val = row[i]
IndexError: list index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner
self.run()
File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/Users/j/Documents/Development/crypto/binance/c_subscribe.py", line 19, in print_fifo_stream_buffer_data
parser(oldest_stream_data_from_stream_buffer)
File "/Users/j/Documents/Development/crypto/binance/c_parse.py", line 20, in parser
ticker_stream(stream)
File "/Users/j/Documents/Development/crypto/binance/c_parse.py", line 167, in ticker_stream
insert_query = (c_db.Tickers
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 1907, in inner
return method(self, database, *args, **kwargs)
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 1978, in execute
return self._execute(database)
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 2745, in _execute
return super(Insert, self)._execute(database)
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 2474, in _execute
cursor = database.execute(self)
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 3156, in execute
sql, params = ctx.sql(query).query()
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 613, in sql
return obj.__sql__(self)
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 2730, in __sql__
self._generate_insert(self._insert, ctx)
File "/Users/j/Documents/Development/crypto/binance/binance.venv/lib/python3.8/site-packages/peewee.py", line 2682, in _generate_insert
raise ValueError('Missing value for %s.' % column.name)
ValueError: Missing value for total_traded_base_asset_volume.
In [1]:
解决方案
推荐阅读
- databricks - 如何在 Databricks 笔记本中查看 Delta Lake 版本?
- javascript - 选项卡式滑块面板组合不起作用
- amazon-textract - Amazon Textract - 如何提取键值对
- python - Python Selenium 一个隐藏的框架,有时与 java 脚本断言一起出现
- flutter - 从 PageView 中的数组中删除项目后状态未更新
- spring-boot - Liquibase 未在 Spring Boot Kotlin 项目中运行
- ios - 尝试对作为游戏目标的图像使用数组。使目标随机出现 XCODE
- javascript - 在 Android Studio 中缩进 JS
- sql - 如果字段中有多个括号,如何在 SQL 中使用 SUBSTRING 和 CHARINDEX 仅返回括号中包含的字段的右侧部分?
- python - 中间件影响 API 上的所有请求