簡體   English   中英

pyodbc.OperationalError TCP 提供程序:錯誤代碼 0x2746 & TCP 提供程序:錯誤代碼 0x20 (32)

[英]pyodbc.OperationalError TCP Provider: Error code 0x2746 & TCP Provider: Error code 0x20 (32)

您好,我在使用 pyodbc 時遇到問題,我正在嘗試在 SQL DB 中進行更新。 我有一個測試集,其中更新應該被調用 3 次。

第一次運行沒有問題沒有任何問題,然后第二次我有這個錯誤消息:

pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 13 for SQL Server]TCP Provider: Error code 0x2746 (10054) (SQLExecDirectW)')

在第三個我有這個消息:

pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 13 for SQL Server]TCP Provider: Error code 0x20 (32) (SQLExecDirectW)')

我試圖搜索那些錯誤代碼,它似乎與數據庫連接有關,但我很確定我的數據庫沒問題並且與我的程序連接良好。

這是我的更新方式:

def depreciate_hi_by_id_data_file(self,id_data_file):
    str_query = f"""UPDATE HMOQTHEI SET HEI_IS_DEPRECIATED = 1 WHERE HEI_HEALTH_INDICATOR_ID IN (SELECT HMOQTHEI.HEI_HEALTH_INDICATOR_ID FROM HMOQTDAF INNER JOIN HMOQTHEI ON HMOQTDAF.DAF_DATA_FILE_ID = HMOQTHEI.HEI_DATA_FILE_ID WHERE (HMOQTHEI.HEI_IS_DEPRECIATED = 0 AND HMOQTDAF.DAF_FILE_NAME = '{id_data_file}' ))"""
    self.logger.info('MARKING HI FOR DEPRECIATION')
    try:
        self.database.execute_update_query(str_query)
        self.logger.info('HI SUCCESSFULLY DEPRECIATED')
    except Exception as e:
        self.logger.exception('HI DEPRECIATION FAILED')

def execute_update_query(self, str_query: str):
    self.logger.debug(f'DEBUG | Execute query : {str_query}')
    cursor = self.connection.cursor()
    cursor.execute(str_query)
    self.connection.commit()
    cursor.close()

我覺得奇怪的是,對於這個函數的 3 次調用,我有 3 種不同的行為。 我還嘗試在 zeppelin 筆記本中運行我的 sql 請求,它可以工作:

%python

from pandas import read_sql_query
from pyodbc import connect

#-HMO011-HMO011-HMO011-HMO011-HMO011-HMO011-HMO011-HMO011
str_driver = "xxxx"
str_server = "xxxx"
str_database = "xxxx"
str_username = "xxxx"
str_password = "xxxx"


str_connection = 'DRIVER=' + str_driver + ';SERVER=' + str_server + ';DATABASE=' + str_database + ';UID=' + str_username + ';MARS_Connection=Yes' + ';PWD=' + str_password
connection = connect(str_connection)
cursor = connection.cursor()
id_data_file = "001_306_53_20201201102042.json"
str_query = f"""UPDATE HMOQTHEI SET HEI_IS_DEPRECIATED = 0 WHERE HEI_HEALTH_INDICATOR_ID IN (SELECT HMOQTHEI.HEI_HEALTH_INDICATOR_ID FROM HMOQTDAF INNER JOIN HMOQTHEI ON HMOQTDAF.DAF_DATA_FILE_ID = HMOQTHEI.HEI_DATA_FILE_ID WHERE (HMOQTHEI.HEI_IS_DEPRECIATED = 1 AND HMOQTDAF.DAF_FILE_NAME = '{id_data_file}' ))"""

cursor.execute(str_query)
connection.commit()
cursor.close()
connection.close()

好的,所以我終於找到了問題所在:我在 class 的屬性中聲明了我的 DBMANAGER,該屬性在多進程中啟動了 function,因此,3 個請求相互沖突,所以我在每個進程中重新定義了我的 DBMANAGER現在一切都很好

結論:謹防多進程訪問數據庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM