pymssql InterfaceError:连接已关闭,但仅在循环中(!)
Posted
技术标签:
【中文标题】pymssql InterfaceError:连接已关闭,但仅在循环中(!)【英文标题】:pymssql InterfaceError: Connection is closed, but only in a loop(!) 【发布时间】:2017-02-10 18:14:46 【问题描述】:我正在开发一个 ETL(提取、转换、加载)工具来自动化一些办公室工作。每个员工都有一个单独的数据集;抓取网站(以员工 ID 编号作为输入变量)给了我一个数据集。
主函数如下所示:
for emp_number in all_emp_numbers:
#scrape html from website:
web_element_scraper.main_function(str(emp_number))
time.sleep(5)
# take scraped html from one html file, clean it, and place the cleaned html in
# another file:
web_element_cleaner.main_function('results_cache.html','detagged_markup.html')
time.sleep(5)
# convert html table into a set of nested lists:
table_values = table_converter.desired_table
time.sleep(3)
# upload nested lists (i.e., a "list of lists" into MS SQL Server 2008 database:
db_upload.main_function(str(emp_number))
time.sleep(5)
print("ETL process completed.")
所有相关模块均已导入等
这是我的问题开始的地方:如果我为任何单个员工编号运行此脚本,则脚本执行良好,并且值按预期显示在 MS SQL Server db 表中。
但是,如果我有多个员工编号并且脚本必须运行多次,第一次迭代(似乎)按预期工作-值已成功上传到表-但是下一次迭代,不管它是哪个员工编号,不是!
基于一些调试和测试,我发现问题仅限于 SQL Server 连接 - 即,对于后续迭代,我收到此错误:
pymssql.InterfaceError: Connection is closed.
我真的不知道如何解决这个问题,尤其是因为连接在第一次迭代时就已经正常工作了。
编辑添加:这是 db_upload.py 模块:
import pymssql
import credentials_page
import table_converter
import time
db_connect = pymssql.connect(
server = credentials_page.database_server,
user = credentials_page.database_username,
password = credentials_page.database_password,
database = credentials_page.database_name
)
def main_function(emp_id):
my_cursor = db_connect.cursor()
data_table = table_converter.desired_table
# adjust date format:
for data_row in data_table:
data_row[0] = data_row[0][:26]
data_row.append(emp_id)
for individual_line in data_table:
my_cursor.execute("INSERT INTO [db_table_name] VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)", tuple(individual_line))
db_connect.commit()
time.sleep(3)
db_connect.close()
time.sleep(2)
print("Data uploaded.")
【问题讨论】:
至少我们需要查看 db_upload.main_function 的内容 @MarkOmo 来了 【参考方案1】:您不能提交多条记录的原因是因为在您的函数中您正在调用 .close() 函数,该函数会关闭连接并要求您在函数内部运行 connect ,就像您现在构建的那样当你导入函数时,它只会被调用一次。
请参阅 pymssql here 中的相关文档
【讨论】:
以上是关于pymssql InterfaceError:连接已关闭,但仅在循环中(!)的主要内容,如果未能解决你的问题,请参考以下文章
使用 PyMySQL 的 InterfaceError(数据库连接关闭)
InterfaceError:连接已关闭(使用 django + celery + Scrapy)
pymysql.err.InterfaceError: (0, '')解决办法
mysql.connector.errors.interfaceerror 2003