Anda tidak dapat melakukannya dengan prosedur tersimpan seperti yang tertulis. Itu hanya akan menyisipkan satu baris pada satu waktu, jadi untuk menyisipkan n baris Anda harus menyebutnya n kali.
Juga, sejauh yang saya tahu Anda tidak dapat mengubah prosedur tersimpan untuk menyisipkan n baris tanpa menggunakan tabel sementara atau solusi lain karena MySQL tidak mendukung parameter bernilai tabel ke prosedur tersimpan.
Namun, Anda dapat menyisipkan beberapa baris sekaligus jika Anda menggunakan pernyataan INSERT biasa dan .executemany
. pymysql akan menggabungkan sisipan menjadi satu atau lebih sisipan multi-baris
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)
Kode di atas menghasilkan yang berikut di 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
Perhatikan bahwa pymysql tidak dapat menggabungkan panggilan ke prosedur tersimpan dengan cara yang sama, jadi jika Anda ingin menggunakan
mysql_stmt = "CALL stuff_one(%s, %s)"
alih-alih INSERT biasa maka general_log akan berisi
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