Base de datos de Python Create Access usando win32com
ms-access (2)
Quiero crear una base de datos de Access (* .accdb) desde dentro de una secuencia de comandos de Python. Usando win32com y Dispatch puedo llamar a la aplicación. Sin embargo, no puedo encontrar nada sobre cómo crear una nueva base de datos.
access = win32com.client.Dispatch(''Access.Application'')
En ese momento no necesito poner datos en la base de datos y lo haría usando pyodbc; simplemente necesito crear una base de datos vacía.
¿Alguien tiene un ejemplo sobre cómo hacer esto?
Saludos Thomas
Para crear un archivo .accdb nuevo y vacío, el siguiente código de Python debería ser el truco:
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.''
[Editar 1]
Un comentario en un blog publicado aquí sugiere que si la llamada .Create
genera un error de "Clase no registrada", es posible que necesite usar regsvr32.exe
para volver a registrar msadox.dll
. Tenga en cuenta "bitness" cuando intente esto: hay versiones de 32 bits y 64 bits de ambos archivos:
64 bits
C: / Windows / System32 / regsvr32.exe
C: / Archivos de programa / Archivos comunes / System / ado / msadox.dll
32 bits
C: / Windows / SysWOW64 / regsvr32.exe
C: / Archivos de programa (x86) / Archivos comunes / System / ado / msadox.dll
Además, tenga en cuenta que podría estar ejecutando Python de 32 bits en una máquina de 64 bits.
[Editar 2]
Hice algunas pruebas y llegué a la conclusión de que este enfoque no funcionaba en este caso particular porque la secuencia de comandos de Python se estaba ejecutando como de 64 bits, pero el motor de base de datos de Access de 64 bits no estaba instalado. (Office de 32 bits solo instala la versión de 32 bits de ACE).
El mensaje de error fue quizás un poco engañoso. No era el componente ADOX el que faltaba (no estaba registrado), era la versión de 64 bits del motor ACE en sí que no se podía encontrar.
Además, en una máquina de 64 bits con acceso de 32 bits instalado, la versión de 64 bits de ACE nunca estará disponible porque no se puede instalar.
Esto podría tener implicaciones cuando intente manipular datos dentro del archivo .accdb desde un script de Python de 64 bits. No tenía Python disponible en mi máquina de prueba "Windows de 32 bits en Windows de 64 bits", pero cuando probé el siguiente 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
...los resultados fueron los siguientes:
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.
La secuencia de comandos falló cuando se ejecutó como 64 bits, pero funcionó cuando se ejecutó como de 32 bits.
Recomendación: Si su máquina tiene instalado Access de 32 bits, probablemente sea mejor que ejecute sus scripts de Python también como de 32 bits.
Usted tiene un objeto de aplicación de acceso. Use su método DBEngine.CreateDatabase
para crear su archivo db.
Este ejemplo funcionó desde Python 2.7 para crear un archivo de base de datos de formato MDB. Para crear un ACCDB, use 128 (dbVersion120) para 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