【发布时间】:2021-06-16 22:18:50
【问题描述】:
我有一个在远程主机上运行的 MySQL 服务器。与主机的连接相当慢,它会影响我正在使用的 Python 代码的性能。我发现使用 executemany() 函数比使用循环插入许多行有了很大的改进。我的挑战是,对于我插入一个表的每一行,我需要在另一个表中插入几行。我下面的示例不包含太多数据,但我的生产数据可能是数千行。
我知道这个话题在很多地方都被问过很多次了,但是我没有看到任何明确的答案,所以我在这里问...
- 有没有办法获取使用 executemany() 调用创建的自动生成密钥的列表?
- 如果不是,我可以使用 last_insert_id() 并假设自动生成的键是按顺序排列的吗?
- 看看下面的示例代码,有没有更简单或更好的方法来完成这项任务?
- 如果我的 汽车 字典为空怎么办?不会插入任何行,那么 last_insert_id() 会返回什么?
我的桌子...
Table: makes
pkey bigint autoincrement primary_key
make varchar(255) not_null
Table: models
pkey bigint autoincrement primary_key
make_key bigint not null
model varchar(255) not_null
...还有代码...
...
cars = {"Ford": ["F150", "Fusion", "Taurus"],
"Chevrolet": ["Malibu", "Camaro", "Vega"],
"Chrysler": ["300", "200"],
"Toyota": ["Prius", "Corolla"]}
# Fill makes table with car makes
sql_data = list(cars.keys())
sql = "INSERT INTO makes (make) VALUES (%s)"
cursor.executemany(sql, sql_data)
rows_added = len(sqldata)
# Find the primary key for the first row that was just added
sql = "SELECT LAST_INSERT_ID()"
cursor.execute(sql)
rows = cursor.fetchall()
first_key = rows[0][0]
# Fill the models table with the car models, linked to their make
this_key = first_key
sql_data = []
for car in cars:
for model in cars[car]:
sql_data.append((this_key, car))
this_key += 1
sql = "INSERT INTO models (make_key, model) VALUES (%s, %s)"
cursor.executemany(sql, sql_data)
cursor.execute("COMMIT")
...
【问题讨论】:
标签: python mysql key executemany