sql >> Database >  >> RDS >> Mysql

Hoe kan ik een lijst invoegen die is geretourneerd door een pyodbc mssql-query in mysql via een opgeslagen procedure met behulp van pymysql

U kunt dat niet doen met uw opgeslagen procedure zoals geschreven. Er wordt slechts één rij tegelijk ingevoegd, dus om n . in te voegen rijen zou je het n . moeten noemen keer.

Voor zover ik weet kun je de opgeslagen procedure ook niet wijzigen om n . in te voegen rijen zonder een tijdelijke tabel of een andere tijdelijke oplossing te gebruiken, omdat MySQL geen tabelwaardeparameters voor opgeslagen procedures ondersteunt.

U kunt echter meerdere rijen tegelijk invoegen als u een gewone INSERT-instructie en .executemany gebruikt . pymysql bundelt de inserts in een of meer multi-row inserts

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)

De bovenstaande code produceert het volgende in de 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  

Merk op dat pymysql oproepen niet op dezelfde manier kan bundelen naar een opgeslagen procedure, dus als u

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

in plaats van een gewone INSERT, dan zou de general_log

. bevatten
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  



  1. Het serialiseerbare isolatieniveau

  2. Kan geen instructies voor gegevensmanipulatie uitgeven met executeQuery()

  3. Wat gebeurt er als ik boolean True-False naar een PDO-statement stuur als een parameter die aan een int-veld is gebonden?

  4. Hulpprogramma voor clusterverificatie dat een groot aantal xml-bestanden genereert op het bestandssysteem "/u01".