Sie können das nicht mit Ihrer gespeicherten Prozedur wie geschrieben tun. Es wird jeweils nur eine Zeile eingefügt, also zum Einfügen von n Zeilen müssten Sie es n nennen Mal.
Soweit ich weiß, können Sie die gespeicherte Prozedur auch nicht ändern, um n einzufügen Zeilen ohne Verwendung einer temporären Tabelle oder einer anderen Problemumgehung, da MySQL keine Tabellenwertparameter für gespeicherte Prozeduren unterstützt.
Sie können jedoch mehrere Zeilen gleichzeitig einfügen, wenn Sie eine reguläre INSERT-Anweisung und .executemany
verwenden . pymysql bündelt die Einfügungen in eine oder mehrere mehrzeilige Einfügungen
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)
Der obige Code erzeugt Folgendes im 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
Beachten Sie, dass pymysql Aufrufe an eine gespeicherte Prozedur nicht auf die gleiche Weise bündeln kann. Wenn Sie also
verwenden würdenmysql_stmt = "CALL stuff_one(%s, %s)"
Anstelle eines regulären INSERT würde das general_log dann
enthalten190430 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