我想从 Python 脚本中创建一个 Access 数据库 (*.accdb)。使用 win32com 和 Dispatch 我可以调用该应用程序。但是,我找不到有关如何创建新数据库的任何信息。
access = win32com.client.Dispatch('Access.Application')
那时我不需要将数据放入数据库,我会使用 pyodbc 来做这件事——我只需要创建一个空数据库。
有人有如何做到这一点的例子吗?
干杯托马斯
您有一个 Access 应用程序对象。使用它的DBEngine.CreateDatabase
方法来创建你的 db 文件。
此示例从 Python 2.7 开始创建 MDB 格式的数据库文件。要创建 ACCDB,请将 128 (dbVersion120) 用于dbVersion
.
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
要创建一个新的空 .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]
对此处发布的博客的评论表明,如果.Create
调用生成“类未注册”错误,您可能需要使用regsvr32.exe
重新注册msadox.dll
。尝试此操作时请注意“位”:这两个文件都有 32 位和 64 位版本:
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 位机器上,64 位版本的 ACE 将永远不可用,因为它无法安装
当您尝试从 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 位。
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()
请点击此链接了解更多信息: