使用SQLAlchemy从Pandas Dataframe创建Python MS Access数据库表

时间:2014-12-18 20:43:35

标签: python ms-access sqlalchemy pyodbc pypyodbc

我试图从Python创建MS Access数据库,并想知道是否可以直接从pandas数据帧创建表。我知道我可以使用pandas dataframe.to_sql()函数成功地将数据帧写入SQLite数据库,或者使用sqlalchemy引擎将其他数据库格式(但不幸的是不是Access),但我无法获得所有部分零件聚集在一起。这是我一直在测试的代码段:

import pandas as pd
import sqlalchemy
import pypyodbc     # Used to actually create the .mdb file
import pyodbc

# Connection function to use for sqlalchemy
def Connection():
    MDB = 'C:\\database.mdb'
    DRV = '{Microsoft Access Driver (*.mdb)}'
    connection_string = 'Driver={Microsoft Access Driver (*.mdb)};DBQ=%s' % MDB
    return pyodbc.connect('DRIVER={};DBQ={}'.format(DRV,MDB))


# Try to connect to the database
try:
    Conn = Connection()
# If it fails because its not been created yet, create it and connect to it
except:
    pypyodbc.win_create_mdb(MDB)
    Conn = Connection()

# Create the sqlalchemy engine using the pyodbc connection
Engine = sqlalchemy.create_engine('mysql+pyodbc://', creator=Connection)

# Some dataframe
data = {'Values'     : [1., 2., 3., 4.],
        'FruitsAndPets'  : ["Apples", "Oranges", "Puppies", "Ducks"]}
df = pd.DataFrame(data)

# Try to send it to the access database (and fail)
df.to_sql('FruitsAndPets', Engine, index = False)

我不确定我尝试做的事情是否可以使用我当前正在使用的软件包,但我想在将自己的hacky数据框写入MS Access表之前先查看此处功能。也许我的sqlalchemy引擎设置错了?

这是我在引擎中mssql+pyodbc错误的结束:

cursor.execute(statement, parameters)
sqlalchemy.exc.DBAPIError: (Error) ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access Driver] Could not find file 'C:\\INFORMATION_SCHEMA.mdb'. (-1811) (SQLExecDirectW)") u'SELECT [COLUMNS_1].[TABLE_SCHEMA], [COLUMNS_1].[TABLE_NAME], [COLUMNS_1].[COLUMN_NAME], [COLUMNS_1].[IS_NULLABLE], [COLUMNS_1].[DATA_TYPE], [COLUMNS_1].[ORDINAL_POSITION], [COLUMNS_1].[CHARACTER_MAXIMUM_LENGTH], [COLUMNS_1].[NUMERIC_PRECISION], [COLUMNS_1].[NUMERIC_SCALE], [COLUMNS_1].[COLUMN_DEFAULT], [COLUMNS_1].[COLLATION_NAME] \nFROM [INFORMATION_SCHEMA].[COLUMNS] AS [COLUMNS_1] \nWHERE [COLUMNS_1].[TABLE_NAME] = ? AND [COLUMNS_1].[TABLE_SCHEMA] = ?' (u'FruitsAndPets', u'dbo')

以及引擎中mysql+pyodbc的结束错误:

cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'. (-3500) (SQLExecDirectW)") "SHOW VARIABLES LIKE 'character_set%%'" ()

请注意,我不在乎是否使用sqlalchemy或pandas to_sql()我正在寻找一种简单的方法来轻松地将数据帧导入MS Access数据库。如果它转储到JSON然后是一个循环函数来手动插入行,无论如何,如果它运行良好,我会接受它。

2 个答案:

答案 0 :(得分:4)

对于那些仍在研究这个问题的人来说,基本上你不能在没有太多困难的情况下使用pandas to_sql方法进行MS Access。如果你决定这样做,这里有一个链接,有人修复了sqlalchemy的访问方言(可能是OP的代码适用于这个引擎):

connecting sqlalchemy to MSAccess

将数据帧导入MS Access的最佳方法是从记录中构建INSERT语句,然后通过pyodbc或pypyodbc进行连接并使用游标执行它们。您必须一次插入一个,如果您有大量数据,最好将其分解为块(大约5000)。

答案 1 :(得分:3)

pypyodbc网站上有一个简短的教程,用于执行SQL命令和填充Access数据库:

我还发现了这篇有用的Python wiki文章:

它声明mxODBC还具有使用MS Access的能力。很久以前,我相信我也成功地使用ADOdb连接到MS Access。

几年前,SQLAlchemy对Microsoft Access进行了实验性支持。我用它来将Access数据库移动到MS SQL Server。我使用SQLAlchemy自动加载/反映数据库。它非常方便。我相信代码是0.5版本。您可以阅读一下我做了什么here