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

Django + Psycopg2:InterfaceError:仅支持协议 3

pymssql连接sql server报错:pymssql._pymssql.OperationalError