python - 我可以将 pyodbc executemany 与 sql 存储过程一起使用吗?

标签 python t-sql stored-procedures pyodbc executemany

我需要将大量数据从 pandas 数据帧写入 MS-SQL 表(一次 1000 行甚至更多行)。

我将 pyodbc executemanyfast_executemany=True 一起使用,否则每个表需要几个小时。现在,出于安全原因,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()])

所有数据帧将立即(并且快速)插入到表中。但是,调用 SP 似乎无法做到同样的事情。

有没有办法将pyodbcexecutemany与存储过程一起使用?

最佳答案

是的,我们可以将 executemany 与 SQL Server 中的存储过程一起使用:

表:

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()

关于python - 我可以将 pyodbc executemany 与 sql 存储过程一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57551338/

相关文章:

postgresql - 如何在 postgres 过程中通过 arg 文本更改模式

python - Openpyxl:迭代单元格范围

python - 更好的方法吗?

sql - 忽略特定列中的相同值

当前打卡员工的 SQL 列表

MySQL Case Select 的行为不符合预期

Python列表理解: populating each inner-list with two variables

python - 避免数组迭代中的跳行

SQL Server 按替代分组而不丢失行

sql - 在单个存储过程中返回多个结果集是一种很好的做法