Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso inserir uma lista retornada da consulta pyodbc mssql no mysql através do procedimento armazenado usando pymysql


Você não pode fazer isso com seu procedimento armazenado conforme escrito. Ele só irá inserir uma linha de cada vez, então para inserir n linhas você teria que chamá-lo de n vezes.

Além disso, até onde eu sei, você não pode modificar o procedimento armazenado para inserir n rows sem usar uma tabela temporária ou alguma outra solução alternativa porque o MySQL não suporta parâmetros com valor de tabela para procedimentos armazenados.

Você pode, no entanto, inserir várias linhas de uma vez se usar uma instrução INSERT normal e .executemany . pymysql agrupará as inserções em uma ou mais inserções de várias linhas
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)

O código acima produz o seguinte no 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  

Observe que o pymysql não pode agrupar chamadas para um procedimento armazenado da mesma maneira, portanto, se você usar
mysql_stmt = "CALL stuff_one(%s, %s)"

em vez de um INSERT regular, o general_log conteria
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