Python使用win32com创建Access数据库
Posted
技术标签:
【中文标题】Python使用win32com创建Access数据库【英文标题】:Python Create Access database using win32com 【发布时间】:2013-03-27 10:19:11 【问题描述】:我想从 Python 脚本中创建一个 Access 数据库 (*.accdb)。 使用 win32com 和 Dispatch 我可以调用该应用程序。但是,我找不到有关如何创建新数据库的任何信息。
access = win32com.client.Dispatch('Access.Application')
那时我不需要将数据放入数据库中,我会使用 pyodbc 来完成 - 我只需要创建一个空数据库。
有人有如何做到这一点的例子吗?
托马斯干杯
【问题讨论】:
【参考方案1】:您有一个 Access 应用程序对象。使用它的DBEngine.CreateDatabase
方法来创建你的数据库文件。
此示例使用 Python 2.7 创建 MDB 格式的数据库文件。要创建 ACCDB,请为 dbVersion
使用 128 (dbVersion120)。
import win32com.client
oAccess = win32com.client.Dispatch('Access.Application')
DbFile = r'C:\Users\hans\Documents\NewDb.mdb'
dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0'
# dbVersion40 64
dbVersion = 64
oAccess.DBEngine.CreateDatabase(DbFile, dbLangGeneral, dbVersion)
oAccess.Quit()
del oAccess
【讨论】:
太棒了,这就像一个魅力!还有一个问题:我从哪里获得您为 dbLangGeneral 设置的所有信息?干杯托马斯 在 Access 会话中,我使用了Debug.Print dbLangGeneral
并复制了它返回的字符串。有关其他选项的详细信息,请参阅 CreateDatabase 帮助主题。【参考方案2】:
要创建一个新的空 .accdb 文件,下面的 Python 代码应该可以解决问题:
import win32com.client
f = 'C:\\Users\\Gord\\Desktop\\pyTest.accdb'
c = win32com.client.Dispatch('ADOX.Catalog')
c.Create('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + f + ';')
c = None
print '"' + f + '" created.'
[编辑 1]
对博客帖子here 的评论表明,如果.Create
调用产生“类未注册”错误,您可能需要使用regsvr32.exe
重新注册msadox.dll
。尝试执行此操作时请注意“位”:这些文件有 32 位和 64 位版本both:
64 位 C:\Windows\System32\regsvr32.exe C:\Program Files\Common Files\System\ado\msadox.dll
32 位 C:\Windows\SysWOW64\regsvr32.exe C:\Program Files (x86)\Common Files\System\ado\msadox.dll
另外,请注意,您可以在 64 位机器上运行 32 位 Python。
[编辑 2]
我进行了一些测试并得出结论,这种方法在这种特殊情况下不起作用,因为 Python 脚本以 64 位运行,但未安装 64 位 Access 数据库引擎。 (32 位 Office 仅安装 32 位版本的 ACE。)
错误信息可能有点误导。丢失(未注册)的不是 ADOX 组件,而是找不到 ACE 引擎本身的 64 位版本。
此外,在安装了 32 位 Access 的 64 位计算机上,ACE 的 64 位版本将永远不可用,因为它无法安装
当您尝试从 64 位 Python 脚本操作 .accdb 文件中的数据时,这很可能会产生影响。我的“64 位 Windows 上的 32 位 Office”测试机上没有可用的 Python,但是当我尝试以下 VBScript 时...
Option Explicit
Dim con, rst
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\Users\Gord\Desktop\adoTest.accdb;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT Field1 FROM Table1", con
Wscript.Echo rst(0).Value
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing
...结果如下:
C:\__tmp>C:\Windows\System32\cscript.exe /nologo dataAccessTest.vbs
C:\__tmp\dataAccessTest.vbs(4, 1) ADODB.Connection: Provider cannot be found.
It may not be properly installed.
C:\__tmp>C:\Windows\SysWOW64\cscript.exe /nologo dataAccessTest.vbs
This is Table1 data in Access.
脚本在 64 位运行时失败,但在 32 位运行时运行。
建议:如果您的计算机安装了 32 位 Access,您最好将 Python 脚本也运行为 32 位。
【讨论】:
嗨,戈德,感谢您的快速回复!不幸的是,它还没有奏效。我收到以下错误: Traceback(最近一次调用最后一次):文件“C:\THOB\workspace\Toolbox\src\whales.py”,第 102 行,在import win32com.client
ConFileName = r'c:\mydb\myaccess.mdb'
try:
Catalog = win32com.client.Dispatch('ADOX.Catalog')
Catalog.Create('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + ConFileName + ';')
Catalog = None
except:
Exception as e:
print("Database generation failed, Error="+str(e))
print("NewAccessDB.mdb created successfully")
然后你就可以连接访问数据库了:
ConFileName=(r'c:\mydb\myaccess.mdb')
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=' + ConFileName + ';')
cursor = conn.cursor()
要插入访问表:
ConFileName=(r'c:\mydb\myaccess.mdb')
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=' +ConFileName+ ';')
cursor = conn.cursor()
for ta in TableArray:
Sql_insert_query = "INSERT INTO Table1(ID, Value1,Value2,Value3,Value4,Value5,Value6) " \
"VALUES ('a','b','c','d','e','f','g')".format(a=str(ta[0]),b=str(ta[1]),c=str(ta[2]),d=str(ta[3]),e=str(ta[4]),f=str(ta[5]),g=str(ta[6]))
cursor.execute(Sql_insert_query)
conn.commit()
cursor.close()
请点击此链接了解更多信息:
https://elvand.com/python-and-ms-access/
【讨论】:
以上是关于Python使用win32com创建Access数据库的主要内容,如果未能解决你的问题,请参考以下文章
Python 导出报告 Microsoft Access 使用 win32com.client
我应该使用 pyodbc 还是 win32com 使用 python 填写 Microsoft Access 数据库 (.accdb) 中的预先存在的表格?