Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich eine Liste, die von einer pyodbc-mssql-Abfrage zurückgegeben wird, über eine gespeicherte Prozedur mit pymysql in mysql einfügen

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ürden
mysql_stmt = "CALL stuff_one(%s, %s)"

Anstelle eines regulären INSERT würde das general_log dann

enthalten
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