【问题标题】:AttributeError: module 'odbc' has no attribute 'connect' - python with pydevAttributeError:模块'odbc'没有属性'connect'-带有pydev的python
【发布时间】:2018-01-03 23:20:44
【问题描述】:

我对 python 很陌生,我似乎无法找到这个错误的答案。当我运行下面的代码时,我得到了错误

AttributeError: module 'odbc' has no attribute 'connect'

但是,该错误仅在 eclipse 中显示。如果我通过命令行运行它没有问题。我正在运行 python 3.5。我究竟做错了什么?

try:
    import pyodbc
except ImportError:
    import odbc as pyodbc

# Specifying the ODBC driver, server name, database, etc. directly
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=PXLstr,17;DATABASE=Dept_MR;UID=guest;PWD=password')

删除 try...except 块的建议对我不起作用。现在实际导入抛出如下错误:

Traceback (most recent call last):
  File "C:\Users\a\workspace\TestPyProject\src\helloworld.py", line 2, in <module>
    import pyodbc
  File "C:\Users\a\AppData\Local\Continuum\Anaconda3\Lib\site-packages\sqlalchemy\dialects\mssql\pyodbc.py", line 105, in <module>
    from .base import MSExecutionContext, MSDialect, VARBINARY

我确实安装了 pyodbc,并且在 windows 上的命令行中导入和连接工作正常。

谢谢

【问题讨论】:

    标签: python eclipse pydev pyodbc


    【解决方案1】:

    这里的问题是 pyodbc 模块没有导入到您的 try / except 块中。我强烈建议不要将 import 语句放在 try 块中。首先,您需要确保已安装 pyodbc (pip install pyodbc),最好是在 virtualenv 中,然后您可以执行以下操作:

    import pyodbc
    
    cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=PXLstr,17;DATABASE=Dept_MR;UID=guest;PWD=password')
    
    cursor = cnxn.cursor()
    cursor.execute('SELECT 1')
    
    for row in cursor.fetchall():
        print(row)
    

    如果您在 Windows 上运行(鉴于 DRIVER= 参数,看起来是这样),请查看 virtualenvwrapper-win 以管理 Windows Python 虚拟环境:https://pypi.python.org/pypi/virtualenvwrapper-win

    祝你好运!

    【讨论】:

    • 谢谢。它现在显示 import pyodbc 语句的错误 - 我更新了上面的问题以显示错误。
    • 谢谢你,你的回答帮助我找到了问题的核心。现在解决了。
    【解决方案2】:

    Flipper 的回答有助于确定问题在于在 Eclipse 的外部库列表中引用了不正确的库。修复后,问题解决了。

    【讨论】:

      【解决方案3】:

      你的 python 文件的名称是什么?如果您无意中将其命名为“pyodbc.py”,则会出现该错误。因为它试图导入自己而不是预期的 pyodbc 模块。

      【讨论】:

      • 在提供的堆栈跟踪中,该文件看起来像是helloworld.py
      【解决方案4】:

      这就是解决方案! 只需安装和使用“pypyodbc”而不是“pyodbc”! 我的测试示例如下。更改 SERVER_NAME 和 DATA_NAME 和 DRIVER 的数据。也放你自己的记录。祝你好运!

      import sys
      import pypyodbc as odbc
      
      records = [
          ['x', 'Movie', '2020-01-09', 2020],
          ['y', 'TV Show', None, 2019]
      ]
      
      DRIVER = 'ODBC Driver 11 for SQL Server'
      SERVER_NAME = '(LocalDB)\MSSQLLocalDB'
      DATABASE_NAME = 'D:\ASPNET\SHOJA.IR\SHOJA.IR\APP_DATA\DATABASE3.MDF'
      
      conn_string = f"""
          Driver={{{DRIVER}}};
          Server={SERVER_NAME};
          Database={DATABASE_NAME};
          Trust_Connection=yes;
      """
      
      try:
          conn = odbc.connect(conn_string)
      except Exception as e:
          print(e)
          print('task is terminated')
          sys.exit()
      else:
          cursor = conn.cursor()
      
      
      insert_statement = """
          INSERT INTO NetflixMovies
          VALUES (?, ?, ?, ?)
      """
      
      try:
          for record in records:
              print(record)
              cursor.execute(insert_statement, record)
      except Exception as e:
          cursor.rollback()
          print(e.value)
          print('transaction rolled back')
      else:
          print('records inserted successfully')
          cursor.commit()
          cursor.close()
      finally:
          if conn.connected == 1:
              print('connection closed')
              conn.close()
      

      【讨论】:

        猜你喜欢
        • 2017-12-05
        • 1970-01-01
        • 2018-04-28
        • 2021-06-16
        • 2021-06-01
        • 2023-04-06
        • 2018-06-16
        • 2015-03-09
        • 2020-10-18
        相关资源
        最近更新 更多