gpt4 book ai didi

python - 如何使用 pymysql 通过存储过程将从 pyodbc mssql 查询返回的列表插入到 mysql 中

转载 作者:行者123 更新时间:2023-11-29 16:04:57 25 4
gpt4 key购买 nike

我正在使用 pyodbc 从 MSSQL 数据库中提取数据,它会在列表中返回我的数据集。然后需要将该数据传输到 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 过程并插入所有相关数据?

最佳答案

How can I use the full list from the MSSQL query, call the MySQL procedure one time and insert all the relevant data?

您无法使用编写的存储过程来做到这一点。它一次只会插入一行,因此要插入 n 行,您必须调用它 n 次。

此外,据我所知,如果不使用临时表或其他解决方法,您无法修改存储过程以插入n行,因为MySQL不支持存储过程的表值参数.

但是,如果您使用常规 INSERT 语句和 .executemany,则可以一次插入多行。 pymysql 会将插入捆绑为一个或多个多行插入

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)

上面的代码在 MySQL General_log 中生成以下内容

190430 10:00:53     4 Connect   root@localhost 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)"

general_log 将包含而不是常规 INSERT

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

关于python - 如何使用 pymysql 通过存储过程将从 pyodbc mssql 查询返回的列表插入到 mysql 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55829944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com