2013-03-27 29 views
5

Chcę utworzyć bazę danych Access (* .accdb) z poziomu skryptu Python. Korzystając z Win32com i Dispatch, mogę zadzwonić do aplikacji. Jednak nie mogę znaleźć niczego na temat tworzenia nowej bazy danych.Python Utwórz bazę danych Access za pomocą Win32com

access = win32com.client.Dispatch('Access.Application') 

W tym momencie nie mam potrzebę wprowadzenia danych do bazy danych i chciałbym zrobić to przy użyciu pyodbc - po prostu trzeba utworzyć pustą bazę danych.

Czy ktoś ma przykład, jak to zrobić?

Cheers Thomas

Odpowiedz

4

Masz obiekt aplikacji Dostęp. Użyj jej metody DBEngine.CreateDatabase do utworzenia pliku db.

Ta próbka działała w Pythonie 2.7, aby utworzyć plik bazy danych formatu MDB. Aby utworzyć ACCDB, użyj 128 (dbVersion120) dla 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 
+0

Doskonały, który działał jak czar! Jeszcze jedno pytanie: Skąd czerpię wszystkie informacje z ustawionych dla dbLangGeneral? Pozdrowienia Thomas –

+0

Z poziomu sesji programu Access użyłem 'Debug.Print dbLangGeneral' i skopiowałem ciąg, który został zwrócony. Zobacz temat pomocy CreateDatabase, aby uzyskać szczegółowe informacje na temat innych opcji. – HansUp

1

Aby utworzyć nowy, pusty plik Accdb poniższy kod Python powinno załatwić sprawę:

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.' 

[Edytuj 1]

Komentarz Do Wpis na blogu here sugeruje, że jeśli wywołanie .Create generuje błąd "Class not registered", konieczne może być ponowne użycie regsvr32.exe do ponownej rejestracji msadox.dll. Bądź świadomy "bitness" podczas próby to: Są to 32-bitowe i 64-bitowe wersje zarówno tych plików:

64-bit
C: \ Windows \ System32 \ regsvr32.exe
C: \ Program Files \ Common Files \ system \ ado \ msadox.dll

32-bit
C: \ Windows \ SysWOW64 \ regsvr32.exe
C: \ Program Files (x86) \ Pliki wspólne \ System \ ado \ msadox.dll

Należy również pamiętać, że na komputerze 64-bitowym może być uruchomiony 32-bitowy język Python.

[Edycja 2]

Zrobiłem kilka testów i nie doszedł do wniosku, że takie podejście nie działa w tym konkretnym przypadku, ponieważ skrypt Pythona został uruchomiony jako 64-bitowe, ale 64 - Aparat bazy danych Access nie został zainstalowany. (32-bitowy pakiet Office instaluje tylko 32-bitową wersję ACE.)

Komunikat o błędzie był może nieco mylący. Nie było komponentu ADOX, którego brakowało (niezarejestrowane), nie można było znaleźć 64-bitowej wersji samego silnika ACE.

Ponadto na zainstalowane maszyna 64-bit z 32-bitowym Access, wersja 64-bitowa ACE będzie nigdy być dostępne, ponieważ nie może być zainstalowany

no 64-bit ACE with 32-bit Office

To może być bardzo dobrze mają wpływ na próbę manipulowania danymi w pliku accdb z 64-bitowego skryptu Python. Nie miałem Python dostępny na moim „Biura 32-bitowego na 64-bitowy Windows” maszynie testowej, ale kiedy próbowałem następujące 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 

...Wyniki były następujące:

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. 

Uruchomienie skryptu nie powiodło się w wersji 64-bitowej, ale działało po uruchomieniu jako 32-bitowe.

Zalecenie: Jeśli twoje urządzenie ma zainstalowany 32-bitowy dostęp, prawdopodobnie lepiej będzie, jeśli Twoje skrypty w języku Python będą działać również jako 32-bitowe.

+0

Witaj, dzięki za szybką odpowiedź! Niestety to jeszcze nie działa. Otrzymuję następujący błąd: Traceback (ostatnie ostatnie połączenie): Plik "C: \ THOB \ workspace \ Toolbox \ src \ whales.py", wiersz 102, w access.Create ('Provider = Microsoft.ACE.OLEDB.12.0; Data Source = '+ fpDB +'; ') Plik "", wiersz 2, w polu Utwórz Plik "C: \ Python27 \ ArcGISx6410.1 \ lib \ site -packages \ win32com \ client \ dynamic.py ", linia 282, w _ApplyTypes_ result = self._oleobj_.InvokeTypes (* (dispid, LCID, wFlags, retType, argTypes) + args) –

+0

pywintypes.com_error: (-2147352567, "Wystąpił wyjątek.", (0, Brak, klasa u "nie zarejestrowana", Brak, 0, -2147221164), Brak). –

+0

@ThomasBecker Zaktualizowałem swoją odpowiedź. –

Powiązane problemy