Vous ne pouvez pas faire cela avec votre procédure stockée telle qu'elle est écrite. Il n'insérera qu'une ligne à la fois, donc pour insérer n lignes, vous devriez l'appeler n fois.
De plus, pour autant que je sache, vous ne pouvez pas modifier la procédure stockée pour insérer n lignes sans utiliser de table temporaire ou une autre solution de contournement, car MySQL ne prend pas en charge les paramètres de table pour les procédures stockées.
Vous pouvez cependant insérer plusieurs lignes à la fois si vous utilisez une instruction INSERT normale et .executemany
. pymysql regroupera les insertions dans une ou plusieurs insertions multi-lignes
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)
Le code ci-dessus produit ce qui suit dans 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
Notez que pymysql ne peut pas regrouper les appels à une procédure stockée de la même manière, donc si vous deviez utiliser
mysql_stmt = "CALL stuff_one(%s, %s)"
au lieu d'un INSERT normal, le general_log contiendrait
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