![](/img/trans.png)
[英]How to get a SQL Server stored procedure returned rowset using pyodbc?
[英]How can I insert a list returned from pyodbc mssql query into mysql through stored procedure using pymysql
我使用pyodbc從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過程並插入所有相關數據?
如何使用MSSQL查詢的完整列表,一次調用MySQL過程並插入所有相關數據?
您不能使用您編寫的存儲過程來執行此操作。 它一次只能插入一行,所以要插入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)"
而不是常規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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.