尝试使用PYODBC将访问数据库表读入Pandas的错误

时间:2017-09-12 00:30:49

标签: pandas ms-access pyodbc

我想执行一个简单的任务,即以数据帧的形式将来自MS Access数据库的表数据导入Pandas。我最近有这个工作很好,现在我无法弄清楚为什么它不再工作。我记得在最初对连接进行故障排除时,我需要做的工作是围绕安装具有正确位数的新微软数据库驱动程序,所以我重新访问并重新安装了驱动程序。以下是我用于设置的内容。

在笔记本电脑上安装记录:

  • 操作系统:Windows 7 Professional 64位(9/6/2017验证)
  • 访问版本:访问2016 32bit(经过验证的9/6/2017)
  • Python版本:使用> Python -V(已验证9/11/2017)找到Python 3.6.1(64位)
  • 所需的AccessDatabaseEngine将基于上面的Python位数
  • 使用> AccessDatabaseEngine_X64.exe / passive(已验证9/11/2017)
  • 从2010发行版安装AccessDatabaseEngine_X64.exe的Windows数据库引擎驱动程序

我正在运行以下简单的测试代码来尝试连接到测试数据库。

import pyodbc
import pandas as pd

[x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')]

返回:

['Microsoft Access Driver (*.mdb, *.accdb)']

设置连接字符串。

dbpath = r'Z:\1Users\myfiles\software\JupyterNotebookFiles\testDB.accdb'
conn_str = (r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};''DBQ=%s;' %(dbpath))
cnxn = pyodbc.connect(conn_str)
crsr = cnxn.cursor()

验证我已连接到数据库...

for table_info in crsr.tables(tableType='TABLE'):
    print(table_info.table_name)

返回:

TestTable1

尝试连接到TestTable1时会出现以下错误。

dfTable = pd.read_sql_table(TestTable1, cnxn)

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-14-a24de1550834> in <module>()
----> 1 dfTable = pd.read_sql_table(TestTable1, cnxn)
      2 #dfQuery = pd.read_sql_query("SELECT FROM [TestQuery1]", cnxn)

NameError: name 'TestTable1' is not defined

使用单引号再次尝试会产生以下错误。

dfTable = pd.read_sql_table('TestTable1', cnxn)

---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-15-1f89f9725f0a> in <module>()
----> 1 dfTable = pd.read_sql_table('TestTable1', cnxn)
      2 #dfQuery = pd.read_sql_query("SELECT FROM [TestQuery1]", cnxn)

C:\Users\myfiles\Anaconda3\lib\site-packages\pandas\io\sql.py in read_sql_table(table_name, con, schema, index_col, coerce_float, parse_dates, columns, chunksize)
    250     con = _engine_builder(con)
    251     if not _is_sqlalchemy_connectable(con):
--> 252         raise NotImplementedError("read_sql_table only supported for "
    253                                   "SQLAlchemy connectable.")
    254     import sqlalchemy

NotImplementedError: read_sql_table only supported for SQLAlchemy connectable.

我已经尝试回到驱动程序问题并重新安装32位版本而没有任何运气。

有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

根据pandas.read_sql_table的文档:

  

给定一个表名和一个SQLAlchemy可连接,返回一个DataFrame。   此功能不支持DBAPI连接。

由于pyodbc是DBAPI,因此使用 con 参数支持DBAPI的查询方法pandas.read_sql

dfTable = pd.read_sql("SELECT * FROM TestTable1", cnxn)

答案 1 :(得分:0)

仅使用table_name读取数据库表

import pandas
from sqlalchemy import create_engine

engine=create_engine('postgresql+psycopg2://user:password@localhost/db_name')
df=pandas.read_sql_table("table_name",engine)