AttributeError: module 'odbc' has no attribute 'connect' - python with pydev

AttributeError: module 'odbc' has no attribute 'connect' - python with pydev

我是 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 上的命令行工作正常。

谢谢

这里的问题是 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

祝你好运!

Flipper 的回答有助于确定问题出在 eclipse 的外部库列表中引用了错误的库。修好后,问题就解决了。

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

解决方法在这里! 只需安装并使用 'pypyodbc' 而不是 'pyodbc'! 我有如下测试示例。更改 SERVER_NAME 和 DATA_NAME 和 DRIVER 的数据。也放上自己的records.good运气!

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()