Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso inserire un elenco restituito dalla query pyodbc mssql in mysql tramite la procedura memorizzata usando pymysql

Non puoi farlo con la tua procedura memorizzata come scritta. Inserirà solo una riga alla volta, quindi per inserire n righe dovresti chiamarlo n volte.

Inoltre, per quanto ne so, non è possibile modificare la procedura memorizzata per inserire n righe senza utilizzare una tabella temporanea o qualche altra soluzione alternativa perché MySQL non supporta i parametri con valori di tabella per le procedure memorizzate.

Puoi, tuttavia, inserire più righe contemporaneamente se utilizzi una normale istruzione INSERT e .executemany . pymysql raggrupperà gli inserti in uno o più inserti a più righe

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)

Il codice sopra produce quanto segue in 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  

Nota che pymysql non può raggruppare le chiamate a una stored procedure allo stesso modo, quindi se dovessi usare

mysql_stmt = "CALL stuff_one(%s, %s)"

invece di un normale INSERT, il general_log conterrebbe

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