Du kan inte göra det med din lagrade procedur som skriven. Den kommer bara att infoga en rad i taget, så för att infoga n rader måste du kalla det n gånger.
Så vitt jag vet kan du inte ändra den lagrade proceduren för att infoga n rader utan att använda en temporär tabell eller någon annan lösning eftersom MySQL inte stöder tabellvärdade parametrar till lagrade procedurer.
Du kan dock infoga flera rader samtidigt om du använder en vanlig INSERT-sats och .executemany
. pymysql kommer att bunta inläggen till en eller flera flerradsinfogningar
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)
Ovanstående kod producerar följande i 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
Observera att pymysql inte kan bunta anrop till en lagrad procedur på samma sätt, så om du skulle använda
mysql_stmt = "CALL stuff_one(%s, %s)"
istället för en vanlig INSERT så skulle general_log innehålla
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