Как я могу вставить список, возвращенный из запроса pyodbc mssql в mysql через хранимую процедуру, используя pymysql - PullRequest
0 голосов
/ 24 апреля 2019

Я извлекаю данные из базы данных MSSQL с помощью pyodbc, который возвращает мой набор данных в списке. Затем эти данные необходимо перенести в базу данных MySQL. Я написал следующую хранимую процедуру в MySQL.

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_int_pmt`(
    IN pmtamt DECIMAL(16,10),
        IN pmtdt DATETIME,
        IN propmtref VARCHAR(128),
        IN rtdinv_id INT(11)
    )
BEGIN
    INSERT INTO ay_financials.payment
    (
    pmtamt,
        pmtdt,
        propmtref,
        rtdinv_id
    )
VALUES
    (
    pmtamt,
        pmtdt,
        propmtref,
        rtdinv_id
    );

END

Процедура работает нормально, если я вставляю одну запись за раз. Итак, сейчас я перебираю список из моего запроса MSSQL и вызываю процедуру для каждой записи. Я использую этот код:

cursor = cnxn.cursor()

cursor.execute("""  SELECT *
            FROM [%s].[dbo].[pmt]
            WHERE pmtdt BETWEEN '2018-01-01' AND '2018-12-31'""" %(database))

a = cursor.fetchmany(25)

cnxn.close()

import pymysql

# MySQL configurations
un = 'ssssssss'
pw = '****************'
db = 'ay_fnls'
h = '100.100.100.100'

conn = pymysql.connect(host=h, user=un, password=pw, db=db, cursorclass=pymysql.cursors.DictCursor)

cur = conn.cursor()

for ay in a:
    cur.callproc('sp_int_pmt',(ay.pmtamt,ay.pmtdt,ay.propmtref,ay.rtdinv_id))

conn.commit()

Проблема, с которой я столкнусь при производстве, состоит в том, что этот список будет содержать 10 000-100 000 каждый день. Перебор этих данных не кажется оптимизированным способом справиться с этим.

Как я могу использовать полный список из запроса MSSQL, вызвать процедуру MySQL один раз и вставить все соответствующие данные?

1 Ответ

0 голосов
/ 30 апреля 2019

Как использовать полный список из запроса MSSQL, вызвать процедуру MySQL один раз и вставить все соответствующие данные?

Вы не можете сделать это с помощью своей хранимой процедурыкак написано.Он будет вставлять только одну строку за раз, поэтому для вставки n строк вам придется вызывать ее n раз.

Кроме того, насколько я вас знаюневозможно изменить хранимую процедуру для вставки n строк без использования временной таблицы или другого обходного пути, поскольку MySQL не поддерживает табличные параметры для хранимых процедур.

Однако вы можетевставьте несколько строк одновременно, если вы используете обычный оператор INSERT и .executemany.pymysql объединит вставки в одну или несколько вставок, состоящих из нескольких строканалогичным образом, так что если вы используете

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

вместо обычной INSERT, то general_log будет содержать

190430  9:47:10     3 Connect   root@localhost 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  
...