尝试使用 PYODBC 将 Access 数据库表读入 Pandas 时出错
errors trying to read Access Database Tables into Pandas with PYODBC
我想执行一个简单的任务,以数据帧的形式将 table 数据从 MS Access 数据库导入 Pandas。我最近工作得很好,现在我不明白为什么它不再工作了。我记得最初对连接进行故障排除时,我需要做一些工作来安装具有正确位数的新 Microsoft 数据库驱动程序,因此我重新访问了它并重新安装了驱动程序。以下是我用于设置的内容。
笔记本电脑安装记录:
- OS:Windows 7 Professional 64 位(2017 年 9 月 6 日验证)
- Access 版本:Access 2016 32bit(2017 年 9 月 6 日验证)
- Python 版本:Python 3.6.1(64 位)使用 >Python -V(已验证 9/11/2017)
- 所需的 AccessDatabaseEngine 将基于上面的 Python 位数
- Windows 使用 >AccessDatabaseEngine_X64.exe /passive(已于 2017 年 9 月 11 日验证)
从 2010 版开始使用 AccessDatabaseEngine_X64.exe 安装数据库引擎驱动程序
我正在运行下面的简单测试代码来尝试连接到测试数据库。
import pyodbc
import pandas as pd
[x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')]
returns:
['Microsoft Access Driver (*.mdb, *.accdb)']
正在设置连接字符串。
dbpath = r'Z:Users\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)
returns:
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 位版本,但没有成功。
有人有什么想法吗?
根据 pandas.read_sql_table
的文档:
Given a table name and an SQLAlchemy connectable, returns a DataFrame.
This function does not support DBAPI connections.
因为 pyodbc 是一个 DBAPI,所以使用查询方法,pandas.read_sql
con 参数支持 DBAPI:
dfTable = pd.read_sql("SELECT * FROM TestTable1", cnxn)
仅使用 table_name
读取数据库 table
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)
我想执行一个简单的任务,以数据帧的形式将 table 数据从 MS Access 数据库导入 Pandas。我最近工作得很好,现在我不明白为什么它不再工作了。我记得最初对连接进行故障排除时,我需要做一些工作来安装具有正确位数的新 Microsoft 数据库驱动程序,因此我重新访问了它并重新安装了驱动程序。以下是我用于设置的内容。
笔记本电脑安装记录:
- OS:Windows 7 Professional 64 位(2017 年 9 月 6 日验证)
- Access 版本:Access 2016 32bit(2017 年 9 月 6 日验证)
- Python 版本:Python 3.6.1(64 位)使用 >Python -V(已验证 9/11/2017)
- 所需的 AccessDatabaseEngine 将基于上面的 Python 位数
- Windows 使用 >AccessDatabaseEngine_X64.exe /passive(已于 2017 年 9 月 11 日验证) 从 2010 版开始使用 AccessDatabaseEngine_X64.exe 安装数据库引擎驱动程序
我正在运行下面的简单测试代码来尝试连接到测试数据库。
import pyodbc
import pandas as pd
[x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')]
returns:
['Microsoft Access Driver (*.mdb, *.accdb)']
正在设置连接字符串。
dbpath = r'Z:Users\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)
returns:
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 位版本,但没有成功。
有人有什么想法吗?
根据 pandas.read_sql_table
的文档:
Given a table name and an SQLAlchemy connectable, returns a DataFrame. This function does not support DBAPI connections.
因为 pyodbc 是一个 DBAPI,所以使用查询方法,pandas.read_sql
con 参数支持 DBAPI:
dfTable = pd.read_sql("SELECT * FROM TestTable1", cnxn)
仅使用 table_name
读取数据库 tableimport pandas
from sqlalchemy import create_engine
engine=create_engine('postgresql+psycopg2://user:password@localhost/db_name')
df=pandas.read_sql_table("table_name",engine)