pymssql._pymssql.OperationalError: Statement not executed or executed statement has no resultset报错解决

问题描述

提示:这里描述项目中遇到的问题:

用pymssql的fetchone接口从 sql server数据库中获取然后插入到另外的表中,会产生如下报错
pymssql._pymssql.OperationalError: Statement not executed or executed statement has no resultset

class PyMssqlDB:
    def __init__(self, user, password, host, port, database):
        self.user = user
        self.password = password
        self.host = host
        self.port = port
        self.database = database
        self.conn = None
        self.cursor = None

    def connection(self):
        """
        sql server 数据库连接
        :return:
        """
        self.conn = pymssql.connect(user=self.user,
                                    password=self.password,
                                    host=self.host,
                                    port=self.port,
                                    database=self.database,
                                    )
        self.cursor = self.conn.cursor()

    def close(self):
        """
        关闭连接
        :return:
        """
        self.cursor.close()
        self.conn.close()

    def __enter__(self):
        """
        上下文管理魔术方法
        :return:
        """
        self.connection()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        上下文管理魔术方法
        :param exc_type:
        :param exc_val:
        :param exc_tb:
        :return:
        """
        self.close()

    def select_one(self, sql):
        """
        查询方法
        生成器模式,防止内存撑爆
        :return:
        """
        self.cursor.execute(sql)
        # data = self.cursor.fetchall()
        while True:
            data = self.cursor.fetchone()
            if data:
                yield data
            else:
                break

    def select_all(self, sql):
        """
        查询方法
        :return:
        """
        self.cursor.execute(sql)
        data = self.cursor.fetchall()
        return data

    def sql_delete(self, sql):
        """
        删除方法
        :return:
        """
        row_count = 0  # 删除计数
        try:
            self.cursor.execute(sql)
            self.conn.commit()
            row_count = self.cursor.rowcount
        except Exception as e:
            print(str(e))
        # finally:
        #     self.close()
        return row_count

    def insert(self, sql, params):
        """
        插入方法
        :return:
        """
        row_count = 0  # 插入计数
        try:
            self.cursor.execute(sql, params)
            self.conn.commit()
            row_count = self.cursor.rowcount
        except Exception as e:
            print(str(e))

        return row_count

    def insertmany(self, sql, params):
        """
        插入方法
        :return:
        """
        row_count = 0  # 插入计数
        try:
            self.cursor.executemany(sql, params)
            self.conn.commit()
            row_count = self.cursor.rowcount
        except Exception as e:
            print(str(e))
        return row_count

原因分析:

怀疑是游标的问题
可能是游标先查询,再插入时,该游标失效了,导致没有取到下一条结果数据


解决方案:

初始化时,创建两个连接和游标,一个游标用来取数据,另一个游标用来插入数据,
尝试后,发现可以成功运行了!

class PyMssqlDB:
    def __init__(self, user, password, host, port, database):
        self.user = user
        self.password = password
        self.host = host
        self.port = port
        self.database = database
        self.conn = None
        self.cursor = None
		
		# 新增代码开始 
        self.conn1 = None
        self.cursor1 = None
        # 新增代码结束

    def connection(self):
        """
        sql server 数据库连接
        :return:
        """
        self.conn = pymssql.connect(user=self.user,
                                    password=self.password,
                                    host=self.host,
                                    port=self.port,
                                    database=self.database,
                                    )
        self.cursor = self.conn.cursor()

		# 新增代码开始
        # 再创建一个连接和游标用于fetchone获取数据时的插入,不然会报错,可能游标问题引起的
        self.conn1 = pymssql.connect(user=self.user,
                                     password=self.password,
                                     host=self.host,
                                     port=self.port,
                                     database=self.database,
                                     )
        self.cursor1 = self.conn1.cursor()
        # 新增代码结束

    def close(self):
        """
        关闭连接
        :return:
        """
        self.cursor.close()
        self.conn.close()
		
		# 新增代码开始
        self.cursor1.close()
        self.conn1.close()
        # 新增代码结束

    def insert(self, sql, params):
        """
        插入方法
        :return:
        """
        row_count = 0  # 插入计数
        try:
        	# 用游标1来向表中插入数据
            self.cursor1.execute(sql, params)
            self.conn1.commit()
            row_count = self.cursor1.rowcount
        except Exception as e:
            print(str(e))

        return row_count

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你抱着的是只熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值