Bạn không thể làm điều đó với thủ tục được lưu trữ của bạn như đã viết. Nó sẽ chỉ chèn một hàng tại một thời điểm, vì vậy, để chèn n hàng bạn sẽ phải gọi nó là n lần.
Ngoài ra, theo như tôi biết, bạn không thể sửa đổi thủ tục đã lưu trữ để chèn n hàng mà không sử dụng bảng tạm thời hoặc một số giải pháp khác vì MySQL không hỗ trợ các tham số giá trị bảng cho các thủ tục được lưu trữ.
Tuy nhiên, bạn có thể chèn nhiều hàng cùng một lúc nếu bạn sử dụng câu lệnh INSERT thông thường và .executemany
. pymysql sẽ nhóm các chèn thành một hoặc nhiều chèn nhiều hàng
mssql_crsr = mssql_cnxn.cursor()
mssql_stmt = """\
SELECT 1 AS id, N'Alfa' AS txt
UNION ALL
SELECT 2 AS id, N'Bravo' AS txt
UNION ALL
SELECT 3 AS id, N'Charlie' AS txt
"""
mssql_crsr.execute(mssql_stmt)
mssql_rows = []
while True:
row = mssql_crsr.fetchone()
if row:
mssql_rows.append(tuple(row))
else:
break
mysql_cnxn = pymysql.connect(host='localhost', port=3307,
user='root', password='_whatever_',
db='mydb', autocommit=True)
mysql_crsr = mysql_cnxn.cursor()
mysql_stmt = "INSERT INTO stuff (id, txt) VALUES (%s, %s)"
mysql_crsr.executemany(mysql_stmt, mssql_rows)
Đoạn mã trên tạo ra đoạn mã sau trong MySQL general_log
190430 10:00:53 4 Connect [email protected] on mydb
4 Query INSERT INTO stuff (id, txt) VALUES (1, 'Alfa'),(2, 'Bravo'),(3, 'Charlie')
4 Quit
Lưu ý rằng pymysql không thể nhóm các lệnh gọi vào một thủ tục được lưu trữ theo cùng một cách, vì vậy nếu bạn đang sử dụng
mysql_stmt = "CALL stuff_one(%s, %s)"
thay vì INSERT thông thường thì general_log sẽ chứa
190430 9:47:10 3 Connect [email protected] on mydb
3 Query CALL stuff_one(1, 'Alfa')
3 Query CALL stuff_one(2, 'Bravo')
3 Query CALL stuff_one(3, 'Charlie')
3 Quit