Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je insérer une liste renvoyée par la requête pyodbc mssql dans mysql via une procédure stockée à l'aide de pymysql

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