Не можете да направите това с вашата съхранена процедура, както е написано. Той ще вмъква само един ред наведнъж, така че да се вмъкне n редове ще трябва да го наречете n пъти.
Освен това, доколкото знам, не можете да промените съхранената процедура, за да вмъкнете n редове без използване на временна таблица или някакво друго решение, тъй като MySQL не поддържа стойностни на таблица параметри към съхранените процедури.
Можете обаче да вмъкнете няколко реда наведнъж, ако използвате обикновен израз INSERT и .executemany
. pymysql ще обедини вмъкванията в една или повече многоредови вмъквания
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)
Горният код произвежда следното в 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
Имайте предвид, че pymysql не може да обединява извиквания към съхранена процедура по същия начин, така че ако трябва да използвате
mysql_stmt = "CALL stuff_one(%s, %s)"
вместо обикновен INSERT, тогава general_log ще съдържа
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