我想在Python脚本中创建一个Access数据库(* .accdb)。 使用win32com和Dispatch我可以调用该应用程序。但是,我无法找到有关如何创建新数据库的任何信息。
access = win32com.client.Dispatch('Access.Application')
此时我没有必要将数据放入数据库,我会使用pyodbc执行此操作 - 我只需要创建一个空数据库。
有人有一个如何做到这一点的例子吗?
干杯托马斯
答案 0 :(得分:4)
您有一个Access应用程序对象。使用其DBEngine.CreateDatabase
方法创建db文件。
此示例使用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
答案 1 :(得分:1)
要创建一个新的空.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
重新注册{{1} }。尝试此操作时请注意“位数”:这些文件的两个都有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时......
msadox.dll
......结果如下:
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
以64位运行时脚本失败,但在以32位运行时运行。
建议:如果您的计算机安装了32位Access,那么将Python脚本运行为32位可能会更好。
答案 2 :(得分:0)
def count=context.expand('${#Global#run}')
log.info count
def project1 = runner.testCase.testSuite.project
def properties = new com.eviware.soapui.support.types.StringToObjectMap()
def testcase = project1.getTestSuiteByName("TestSuite 1").getTestCaseByName("Login");
def testcase1 = project1.getTestSuiteByName("TestSuite 1").getTestCaseByName("Logout");
// This will run everything in the selected project
for(int i=1;i<=count;i++){
// testRunner = testcase.run(new com.eviware.soapui.support.types.StringToObjectMap(), false)
def myContext = (com.eviware.soapui.support.types.StringToObjectMap)context
testcase.run(myContext, false)
sleep(70000)
//testRunner = testcase1.run(new com.eviware.soapui.support.types.StringToObjectMap(), false)
testcase1.run(myContext, false)
sleep(5000)
log.info( "Finished running "+i+" cycle" )
if(i==count){
testRunner.cancel('Test Execution is completed')
break;
}
}
然后就可以连接访问数据库了:
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()
请点击此链接了解更多信息: