【发布时间】:2018-01-18 21:40:27
【问题描述】:
我正在尝试自动化每个月初运行的大型数据库进程。目前,这是通过数据库中已经存在的一堆存储过程完成的。我目前的任务是让这些存储过程通过 Python 的 pyodbc 运行。
这些存储过程的棘手之处在于我需要一次运行它们,这样它们就不会占用数据库的所有资源。因此,为了检查存储过程是否已运行,我创建了一个已更新的表,将过程开头的名为“IsFinished”的标志更改为False,最后更改为True。
当我再次尝试查询数据库时出现问题。 SQL Server 中的活动监视器显示我对 Tracking 表的查询为 SUSPENDED 并被存储过程调用阻止。
我什至创建了一个新数据库,以便我可以独立调用这两个数据库,以进一步确保我没有在争夺资源……但我仍在争夺资源。
我正在使用 Python 3.6.4 和 pyodbc 模块。这是我的代码。需要注意的是connect_db_1()和connect_db_2()指向两个独立的数据库。
conn = connect_db_1()
conn.execute("{call dbo.StoredProcedure}")
conn2 = connect_db_2()
start_time = time.time()
finished = False
while finished is False:
print("Looping")
time.sleep(120)
cursor = conn2.execute(
"SELECT IsFinished from dbo.Tracking where StoredProcedureName='dbo.StoredProcedure'")
results = cursor.fetchall()
if results[0][0] == True:
finished = True
print(results)
print(f"dbo.StoredProcedure finished in {time_diff(start_time)} seconds.")
cursor.close()
编辑:添加了我的代码的净化版本。
【问题讨论】:
-
你能展示一些你的python代码吗?您可能正在锁定从 python 端到 DB 的连接。
-
@Anil_M 刚刚添加了我的代码 - 仅更改了表名,并且删除了 try/excepts。
-
为什么不使用 SQL Server 作业代理?
-
在运行脚本之前需要进行大量文件操作。文件操作也需要自动化,因此需要 Python。
标签: python sql-server python-3.x pyodbc