我可以将 pyodbc executemany 与 sql 存储过程一起使用吗?
Can I use pyodbc executemany with sql stored procedure?
我需要将 pandas 数据帧中的大量数据写入 MS-SQL tables(一次 1000 行甚至更多行)。
我正在使用 pyodbc executmany
和 fast_executemany=True
,否则每个 table 需要几个小时。现在,出于安全原因,IT 人员希望我开始使用存储过程而不是直接访问数据库。
问题是,据我所见,SQL怎么说不如python灵活,我必须声明传递给SP的每个变量,所以我看不出如何使用 df.values.tolist()
传递 SP,就像我今天使用 executemany
函数直接访问数据库所做的那样。
例如,假设我有一个数据框 df:
身份证姓名工资
1 乔希 10000
2 迈克尔 5000
3 萨拉 8000
今天我会用:
cursor.fast_executemany = True
insert_str = "INSERT INTO [%s].[%s] VALUES (?, ?, ?)"
cursor.executemany(insert_str % (scheme, table), df.values.tolist()])
并且所有数据帧将立即(并且快速)插入到 table。但是,调用 SP 似乎不可能做到同样的事情。
有没有办法将 pyodbc executemany
用于存储过程?
是的,我们可以将 executemany
与 SQL 服务器中的存储过程一起使用:
Table:
CREATE TABLE [dbo].[Table_1](
[id] [int] NOT NULL,
[name] [nvarchar](50) NULL,
[salary] [int] NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
存储过程:
CREATE PROCEDURE [dbo].[Table_1_insert]
@id int = 0,
@name nvarchar(50),
@salary int
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Table_1 (id, name, salary) VALUES (@id, @name, @salary);
END
Python代码:
df = pd.DataFrame(
[(1, 'Josh', 10000), (2, 'Michael', 5000), (3, 'Sara', 8000)],
columns=['id', 'name', 'salary'])
crsr.executemany("{CALL dbo.Table_1_insert(?, ?, ?)}", df.values.tolist())
cnxn.commit()
我需要将 pandas 数据帧中的大量数据写入 MS-SQL tables(一次 1000 行甚至更多行)。
我正在使用 pyodbc executmany
和 fast_executemany=True
,否则每个 table 需要几个小时。现在,出于安全原因,IT 人员希望我开始使用存储过程而不是直接访问数据库。
问题是,据我所见,SQL怎么说不如python灵活,我必须声明传递给SP的每个变量,所以我看不出如何使用 df.values.tolist()
传递 SP,就像我今天使用 executemany
函数直接访问数据库所做的那样。
例如,假设我有一个数据框 df:
身份证姓名工资
1 乔希 10000
2 迈克尔 5000
3 萨拉 8000
今天我会用:
cursor.fast_executemany = True
insert_str = "INSERT INTO [%s].[%s] VALUES (?, ?, ?)"
cursor.executemany(insert_str % (scheme, table), df.values.tolist()])
并且所有数据帧将立即(并且快速)插入到 table。但是,调用 SP 似乎不可能做到同样的事情。
有没有办法将 pyodbc executemany
用于存储过程?
是的,我们可以将 executemany
与 SQL 服务器中的存储过程一起使用:
Table:
CREATE TABLE [dbo].[Table_1](
[id] [int] NOT NULL,
[name] [nvarchar](50) NULL,
[salary] [int] NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
存储过程:
CREATE PROCEDURE [dbo].[Table_1_insert]
@id int = 0,
@name nvarchar(50),
@salary int
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Table_1 (id, name, salary) VALUES (@id, @name, @salary);
END
Python代码:
df = pd.DataFrame(
[(1, 'Josh', 10000), (2, 'Michael', 5000), (3, 'Sara', 8000)],
columns=['id', 'name', 'salary'])
crsr.executemany("{CALL dbo.Table_1_insert(?, ?, ?)}", df.values.tolist())
cnxn.commit()