Python 使用adbapi异步SqlServer数据库操作

项目中使用的是SqlServer数据库,而我这次负责实现一个很无关紧要的任务,为了不影响主流程,所以需要异步操作数据库,不能阻塞等待。

import pyodbc
import sys
from twisted.enterprise import adbapi
import logging
class SqlServerDB(object):
    def __init__(self, DRIVER, SERVER, DATABASE, UID, PWD):
        self.DRIVER = DRIVER
        self.SERVER = SERVER
        self.DATABASE = DATABASE
        self.UID = UID
        self.PWD = PWD
        self.dbpool = self.GetConnect()
    def GetConnect(self):
        if not self.DATABASE:
            raise (NameError,'no setting db info')
        try:
            dbpool = adbapi.ConnectionPool(dbapiName='pyodbc',DRIVER=self.DRIVER, 
            SERVER = self.SERVER, DATABASE=self.DATABASE, UID=self.UID, PWD=self.PWD,charset="UTF-8")
        except Exception as ex:
            logging.error('SQL Server connecting error,reason is:{}'.format(str(ex)))
            sys.exit()
        return dbpool

1. 该段代码中,关键是adbapi.ConnectionPool函数,数据库的连接串不同的数据库有不同的写法,这个需要根据所使用的第三方库来决定。

2. dbapiName用什么第三方库写什么名字

def updateConclusionWithPB(self, imaPICNo):
    selectSql = "SELECT  CHECKUNITID FROM CONCLUSION WHERE PICNO='{}'".format(imaPICNo)
    self.dbManager.dbpool.runQuery(selectSql).addCallback(self.execUpdateDB, imaPICNo)
    reactor.run()
    
def execUpdateDB(self, waste, checkunitid):
    updateSql = "UPDATE CONCLUSION SET WASTE='{waste}' WHERE CHECKUNITID='{checkunitid}'"
    .format(waste=waste, checkunitid=checkunitid)
    self.dbManager.dbpool.runOperation(updateSql).addCallback(self.receiveResult)


def receiveResult(self, result):
    logging.debug("Update success!")
    reactor.stop()


def errorquery(self, result):
    logging.debug("Error received!", result)
    reactor.stop()
  1. 项目中的两次数据库操作有先后顺序之分,但这里又是异步操作,为了实现该需求,我通过adbapi中的addCallback()来实现,也就是通过绑定回调函数来实现按顺序执行两条sql语句。先执行select语句,拿到select语句的结果,然后再执行update语句。

  2. 另让使用该方法,在代码开始执行的地方,记得加上 reactor.run( )语句,让事件循环开始执行。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部