Pyodbc查询以功能格式工作,但是以面向对象的方式实施时会产生Windows致命异常

问题描述

我正在查询多个sql数据库并将它们组合到一个表中。为了便于讨论,我使用伪代码描述查询,因为我不想公开提供有关数据库的信息。但是,查询不是问题,因此在此示例中应该不成问题。

为了首先确保代码正确运行,我在Jupiter笔记本中实现了其功能版本。我使用的代码如下所示,当插入实际查询时,它可以正常工作。

import pyodbc
import pandas as pd

# This code works in Jupyter notebook using a Python 3.8
conn = pyodbc.connect("Driver={XXXX};"
                      "Server=XXXX;"
                      "uid=XXXX;"
                      "pwd=XXXX")
df = pd.read_sql_query("query goes here",conn)

下一步是将实际.py文件中的代码实现为面向对象的代码,如下所示。

class OpenDB:
def __init__(self):
    # - will pass variables in class instantiation once
    #   I get the classes working correctly
    self.conn = pyodbc.connect("Driver={XXXX};"
                               "Server=XXXX;"
                               "uid=XXXX;"
                               "pwd=XXXX")
    self.cur = self.conn.cursor()
# ----------------------------------------------------------------------------

def close_database_connection(self) -> None:
    self.conn.close()
    return
# ============================================================================
# ============================================================================


class ReadDB(OpenDB):
    def __init__(self):
        OpenDB.__init__(self)
# ----------------------------------------------------------------------------

    def read_data(self) -> pd.DataFrame:
        df = pd.read_sql_query("query goes here",self.conn)
        # - The code fails after the above line and never gets to 
        #   the line below this
        self.close_database_connection()
        return df
# ============================================================================
# ============================================================================

db = ReadDB()
df = db.read_data()

上面编写的面向对象的代码似乎与Jupiter笔记本中使用的代码完全相同;但是,当我如上所述运行它时,查询失败并返回错误Windows fatal exception: access violation error。两种实现之间的查询是相同的,并且为建立数据库连接而传递的信息是相同的。谁能看到为什么Jupiter Notebook实现有效而面向对象的版本无效的原因?两者都使用Python 3.8。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)