首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用fast_executemany写入MS-Access DB不起作用。

用fast_executemany写入MS-Access DB不起作用。
EN

Stack Overflow用户
提问于 2020-06-25 10:24:21
回答 1查看 454关注 0票数 2

我在将数据加载到access数据库时遇到了问题。为了测试目的,我构建了一个小的转换函数,它从hdf-文件中获取所有数据集,并将其写入accdb。没有@event.listens_for(engine, "before_cursor_execute")功能,它可以工作,但是非常慢。用它,它创造了一种奇怪的行为。它在db中只创建一个空表(来自第一个df)并完成执行。for-循环永远不会完成,也不会引发错误。

可能是因为sqlalchemy-access包不支持fast_executemany,但是找不到有关它的任何相关信息。你们中有谁为我输入了如何解决这个问题或能够更快地将数据写入数据库的方法?

非常感谢!

代码语言:javascript
复制
import urllib
from pathlib import Path
from sqlalchemy import create_engine, event

# PATHS
HOME = Path(__file__).parent
DATA_DIR = HOME / 'output'

FILE_ACCESS = DATA_DIR / 'db.accdb'
FILE_HDF5 = DATA_DIR / 'Data.hdf'

# FUNCTIONS
def convert_from_hdf_to_accb():
    # https://github.com/gordthompson/sqlalchemy-access/wiki/Getting-Connected
    driver = '{Microsoft Access Driver (*.mdb, *.accdb)}'
    conn_str = 'DRIVER={};DBQ={};'.format(driver, FILE_ACCESS)
    conn_url = "access+pyodbc:///?odbc_connect={}".format(urllib.parse.quote_plus(conn_str))

    # https://medium.com/analytics-vidhya/speed-up-bulk-inserts-to-sql-db-using-pandas-and-python-61707ae41990
    # https://github.com/pandas-dev/pandas/issues/15276
    # https://stackoverflow.com/questions/48006551/speeding-up-pandas-dataframe-to-sql-with-fast-executemany-of-pyodbc
    engine = create_engine(conn_url)

    @event.listens_for(engine, "before_cursor_execute")
    def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
        if executemany:
            cursor.fast_executemany = True

    with pd.HDFStore(path=FILE_HDF5, mode="r") as store:
        for key in store.keys():
            df = store.get(key)
            df.to_sql(name=key, con=engine, index=False, if_exists='replace')

            print(' IT NEVER REACHES AND DOESNT RAISE AN ERROR :( ')

# EXECUTE
if __name__ == "__main__":
    convert_from_hdf_to_accb()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-25 12:24:43

可能是因为sqlalchemy包不支持fast_executemany

那是真的。pyodbc的fast_executemany特性要求驱动程序支持名为“参数数组”的内部ODBC机制,而Microsoft驱动程序不支持它们。

另请参阅

https://github.com/mkleehammer/pyodbc/wiki/Driver-support-for-fast_executemany

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62573181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档