我想用python在mariadb中插入一个列表(批量插入)。但是这个插入有5个参数,我只想把列表作为一个参数。如果你读了代码,这是有意义的。如果我试图在第一个代码块中只插入event_list,我会得到以下错误:
mariadb.ProgrammingError: statement (5) doesn't match the number of data elements (23305).
下面的代码是我想要的代码(但它不工作)
@classmethod
def insert_data(cls, event_list):
"""Adds events to the database
Args:
events ([string]): Name of events
:param event_list: list of events
"""
try:
DB.create(
f"INSERT INTO Events(road_name, avg_speed, flow_count, ts_event, uuid) VALUES (?, ?, ?, ?, ?)",
event_list)
except Error:
return Error
event_list包含所有事件
event_list中的值示例:
(“A2”、“84”、“13”、“2022年12月06日10:34:12.867Z”、“e9 af 9383 - 2d 7 f-4963- 88 c9 - 38 aa 1d 9 c33 cc”)
事件中也可以有“无”类型(我认为这与此问题无关)
(“A9”、无、无、“2022年12月6日10:34:14.436Z”、“49 c10 cd 1 -3029-4367-a557- 010 d5 eb 1334 a”)
使用当前的insert语句,它会逐个插入每一行,这需要很长时间(因此采用了批量插入的思想)。下面的代码是我现在的代码,它对每一行都进行插入,而不是一次插入所有行。
@classmethod
def insert_data(cls, road_name, avg_speed, flow_count, ts_event, uuid):
"""Adds events to the database
Args:
events ([string]): Name of events
:param road_name:
:param avg_speed:
:param flow_count:
:param ts_event:
:param uuid:
"""
db_values = (road_name, avg_speed, flow_count, ts_event, uuid)
try:
DB.create(
'INSERT INTO Events(road_name, avg_speed, flow_count, ts_event, uuid) VALUES(?, ?, ?, ?, ?)',
db_values)
except Error:
print(Error)
此函数用于添加数据库中的所有事件:
@classmethod
def add_all_events(cls):
# combined_events = DataEndpointFetcher.combine_matching_events()
with open('../refactored_ndw_data.json') as json_file:
combined_events = json.load(json_file)
event_list = list()
for event in tqdm(combined_events['events']):
try:
road_name = event['lanelocation']['road']
avg_speed = event["avgspeed"].get("kmph")
flow_count = event["flow"].get("count")
ts_event = event['ts_event']
uuid = event['measuring_point_id'].get("uuid")
except:
continue
event_list.append((road_name, avg_speed, flow_count, ts_event, uuid))
EventModel.insert_data(event_list)
所以我的问题是:如何仅使用作为VALUES参数的列表进行INSERT。
1条答案
按热度按时间ni65a41a1#
您可以使用Python的{} paramstyle作为:
您创建的
db_values
是一个可以索引的元组,5?需要传递5个变量。