sql >> データベース >  >> RDS >> Mysql

pymysqlを使用してストアドプロシージャを介してpyodbcmssqlクエリから返されたリストをmysqlに挿入するにはどうすればよいですか?

    記述されているストアドプロシージャでは、これを行うことはできません。一度に1行しか挿入されないため、 nを挿入します。 あなたがそれを呼ばなければならない行n

    また、私が知る限り、ストアドプロシージャを変更して nを挿入することはできません。 MySQLはストアドプロシージャへのテーブル値パラメータをサポートしていないため、一時テーブルやその他の回避策を使用しない行。

    ただし、通常のINSERTステートメントと.executemanyを使用すると、一度に複数の行を挿入できます。 。 pymysqlは、挿入を1つ以上の複数行の挿入にバンドルします

    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)
    

    上記のコードは、MySQLgeneral_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  
    

    pymysqlは、同じ方法でストアドプロシージャへの呼び出しをバンドルできないため、使用する場合は

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

    通常のINSERTの代わりに、general_logには

    が含まれます。
    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. データモデリングにおけるセキュリティアプローチ。パート3

    2. MySQL比較データベース

    3. SQLでパーティション内の行をランク付けする方法

    4. Oracleの一意性制約と一意性インデックス