【问题标题】:Table get locked when called an SQL Server SP from pyodbc Python [closed]从pyodbc Python调用SQL Server SP时表被锁定[关闭]
【发布时间】:2022-01-21 07:43:57
【问题描述】:

从 pyodbc Python 调用 SQL Server SP 时表被锁定

我有一张用于测试的表,名为 test。我只是想看看我的代码是否有效。我的python代码很简单,只调用一个SP

这是我的 SQL Server SP 脚本:

ALTER PROCEDURE [dbo].[TestService]   
AS
BEGIN
    SET NOCOUNT ON;

    declare @C1 int
    
    BEGIN TRANSACTION;   
        insert into Test (a1) values ('Service')
    COMMIT TRANSACTION; 

    SELECT @C1 = COUNT(*) FROM test (nolock)    

    SELECT GETDATE(), @C1 as t
END

我的python代码是这样的:

import pyodbc 
import pandas as pd

#df_results.drop(axis=0, inplace=True)    

ConnectionString = "DRIVER={SQL Server};Server=Serv;Database=DB;User Id=user;Password=*****;"

conn = pyodbc.connect(ConnectionString)
df_results = pd.read_sql("EXEC TestService" , conn)
print(df_results)

在运行 python 代码之前,我运行了这个选择

SELECT * FROM Test (NoLock) 

输出是 4 条记录

我运行了 python 脚本,得到了这个输出

0 2021-12-19 00:09:36.887  5

表示记录已插入,记录总数为5

但是当我运行时

SELECT * FROM Test (NoLock) 

我仍然只得到 4 条记录

当我尝试时

SELECT * FROM Test

我超时了。

如何解决?

【问题讨论】:

  • 如何输出开头有“0”?显示的代码不会产生多余的 0?
  • 0 为索引(python 中第一行为 0)
  • @MitchWheat Transaction 试图找出锁定的原因。但它并不是真正需要的
  • " 但它并不是真正需要的" - 是的,我知道!
  • 我想问你为什么使用 read_sql() 来执行存储过程! “将 SQL 查询或数据库表读入 DataFrame。” - pandas.pydata.org/docs/reference/api/pandas.read_sql.html

标签: python sql sql-server tsql odbc


【解决方案1】:

read_sql 不会提交事务。您需要明确提交。

conn = pyodbc.connect(ConnectionString)
df_results = pd.read_sql("EXEC TestService" , conn)
print(df_results)
conn.commit()
conn.close() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2011-04-14
    • 2015-05-18
    相关资源
    最近更新 更多