我应该使用 pyodbc 还是 win32com 使用 python 填写 Microsoft Access 数据库 (.accdb) 中的预先存在的表格?
Posted
技术标签:
【中文标题】我应该使用 pyodbc 还是 win32com 使用 python 填写 Microsoft Access 数据库 (.accdb) 中的预先存在的表格?【英文标题】:Should I use pyodbc or win32com to fill out pre-existing forms in a Microsoft Access Database (.accdb) using python? 【发布时间】:2020-04-15 15:29:40 【问题描述】:我编写了一个从 word 文档中提取字符串的 python 脚本。目标是然后将这些字符串插入到 Access 数据库中预先存在的表单中,保存它,创建表单的副本,从下一个 word 文档中插入不同的字符串,保存,重复。该表单已经包含了我需要的所有字段,并且有“保存”和“创建副本”按钮。
我无法弄清楚如何将字符串插入 Access 表单。
到目前为止,我已经了解到至少有两种方法可以做到这一点,使用 pyodbc 或 win32com。
我使用了以下链接中的代码:
pyodbc - https://datatofish.com/how-to-connect-python-to-ms-access-database-using-pyodbc/
win32com - Write to MS Access table, python win32com
我解决了将 64 位 python 连接到 32 位访问的问题,并且我能够使用 win32com 和 pyodbc 连接到我的 accdb 文件,但就我所知。
pyodbc:
import pyodbc
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\path\folder\my_database_file.accdb;')
cursor = conn.cursor()
win32com:
import win32com.client
# ADODB constants
adVarWChar = 202
adInteger = 3
adParamInput = 1
connection = win32com.client.Dispatch(r'ADODB.Connection')
DSN = (
r'PROVIDER=Microsoft.ACE.OLEDB.12.0;'
r'DATA SOURCE=C:\path\folder\my_database_file.accdb;'
)
connection.Open(DSN)
cmd = win32com.client.Dispatch(r'ADODB.Command')
cmd.ActiveConnection = connection
pyodbc 还是 win32com,哪种方法更好/更容易使用?
另外,一旦我选择了一种方法,我该如何继续?我无法找到有关如何使用这些方法在 Access 中填写表单的文档。我发现的大部分内容都是关于如何在 Access 中填写表格,我不确定如何转录该代码以使用表单,或者该代码最初来自何处。
我没有包含从 word 文档中提取字符串的代码,这部分工作正常,并不是问题的一部分,只是背景信息。
任何正确方向的建议或指示将不胜感激。
【问题讨论】:
【参考方案1】:首先,MS Access 表单和报告不存储任何数据,而是在运行时应用与表或查询数据的可视交互。
其次,您的问题显示了 MS Access 是如何既是 GUI 应用程序又是数据库的multifaceted thing。因此,您的两种方法(win32com
和pyodbc
)有些明显不同并且部分重叠。通常,有两种方式与此软件进行交互:
前端
只需使用已安装的 Microsoft Office 软件 MSAccess.exe 以及所有启用的用户界面功能来设计和使用其对象:表格、查询、表单、报告、宏和模块。
通过编程代码,通过外部客户端(如 Excel VBA、Python 或任何其他与 COM 连接的语言或 API)与Microsoft Access object library 建立接口。
在 Python 中,使用 win32com
允许您访问 MS Access 的 GUI 对象,其中包括表单和报告以及任何其他访问方法,例如 DoCmd.TransferSpreadsheet
或 Application.ImportXML
。要运行查询,您需要访问 Access 应用程序对象的底层数据库。总的来说,这种方法需要在客户端计算机上安装成熟的 Office 应用程序 MSAccess.exe。
后端
使用几乎任何现代通用语言(如 Python)和相应的库,通过 ODBC 或 OLEDB 连接到 .accdb
(或 .mdb
)文件的基础数据库。
在 Python 中,使用 pyodbc
(或 adodbapi
)仅允许您与 Jet/ACE 数据库(Window .dll 文件)进行交互。您不能与任何 GUI 对象(包括表单和报告)进行交互,而只能与表和存储的查询进行交互,并且只能使用由应用层调用的 SQL,这里是 Python。总的来说,这种方法不需要在客户端计算机上安装成熟的 Office 应用程序 MSAccess.exe。
话虽如此,对于您的特定需求,您可能不需要更长、更广泛的win32com
前端方法,因为 Access 表单旨在输入/更新/删除基础表中的数据。换句话说,它们是用户友好的数据处理方式。因此,只需绕过用户界面需求,将提取的 Word 数据直接导入表单后面的数据库表中,pyodbc
是一种更简单的后端方法。
具体来说,回答您的问题:
我编写了一个从 Word 文档中提取字符串的 Python 脚本。目标是然后将这些字符串插入到 Access 数据库中预先存在的表单中,保存它,创建表单的副本,从下一个 word 文档中插入不同的字符串,保存,重复。
首先,除了数据之外,没有人应该复制实际的表单对象。相反,使用cursor
对象和参数化将数据插入到表单后面的数据源中:
# APPEND QUERY WITH PARAMETERS
sql = """INSERT INTO myTableBehindmyForm (Field1, Field2, Field3, ...)
VALUES (?, ?, ?, ...)
"""
# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
表单已经包含了我需要的所有字段,并且有“保存”和“创建副本”按钮。我无法弄清楚如何将字符串插入 Access 表单。
要保存,只需提交上述查询并复制,重复cursor.execute
调用:
# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
conn.commit()
# EXECUTE QUERY WITH TUPLE OF BINDED VALUES
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
cursor.execute(sql, (word_string1, wordstring2, wordstring3, ...))
conn.commit()
我发现的大部分内容都是关于如何在 Access 中填写表格,但我不确定如何转录该代码以使用表单,或者该代码最初来自何处。
同样,无需使用表单(无数据 GUI 对象),只需使用表单后面的表格即可。因此,请使用 pyodbc
或任何兼容的 MS Access 和 Python DB-API 来处理您的数据需求。
【讨论】:
啊,我明白了,我错误地认为表单是我应该处理的。您对表格背后的表格的解释是实际保存数据的内容是巨大的,我不会想到走那条路。感谢您的澄清和措辞非常好的回答,非常感谢。以上是关于我应该使用 pyodbc 还是 win32com 使用 python 填写 Microsoft Access 数据库 (.accdb) 中的预先存在的表格?的主要内容,如果未能解决你的问题,请参考以下文章
pyodbc - ImportError:DLL 加载失败:
我应该使用 Direct3D 还是只使用 Windows GDI 来获得花哨/高性能的 Win32 应用程序 UI? [关闭]
C++在建工程时,应该选择Win32 Application还是Win32 Console Application?它两之