2016-10-12 4 views
2

J'essaye de créer une base de données Access en Python et d'y ajouter deux nouvelles tables. J'utilise win32com et j'ai réussi à créer la base de données mais je ne peux pas créer les tables. Tout ce que je reçois est des erreurs Windows inutiles. Quelqu'un peut-il m'aider?Créer une nouvelle base de données Access et des tables en utilisant Python

Le code suivant fonctionne très bien:

dbname = r'C:/Users/Guest/Desktop/NewDB.mdb' 
db = Dispatch("Access.Application") 
dbEngine = db.DBEngine 
workspace = dbEngine.Workspaces(0) 

dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0' 
newdb = workspace.CreateDatabase(dbname, dbLangGeneral, 64) 

Comment puis-je ajouter de nouvelles tables à cette base de données?

+0

Quelle version d'accès ms? Le docssuggest que vous utilisez façon obsolète d'ouvrir la base de données si ms accès 2000 ou après. – Schollii

+0

Salut Schollii, j'essaye de créer 2002 - 2003 mdb – WRJ

Répondre

3

Parce que MS Access est à la fois une application GUI .exe et une base de données backend, pour créer une base de données est un processus différent de la création d'objets de base de données comme Tables, Vues (ie, requêtes stockées), et même Procédures. En comparaison, l'autre RDMS au niveau du fichier, SQLite, doit ouvrir son shell .exe à CREATE DATABASE. Et les RDMS au niveau du serveur (SQL Server, MySQL, Postgres), il faut se connecter à l'instance du serveur pour exécuter la commande. MS Access n'a pas le shell ou les installations d'instance, juste un objet d'application.

Par conséquent, après avoir créé une base de données avec la méthode CreateDatabase, envisagez d'exécuter une instruction SQL DDL à CREATE TABLE, ce que vous pouvez faire avec la méthode Execute().

Python COM Interface

from win32com.client import Dispatch 

try: 
    dbname = r'C:/Users/Guest/Desktop/NewDB.mdb' 
    accApp = Dispatch("Access.Application") 
    dbEngine = accApp.DBEngine 
    workspace = dbEngine.Workspaces(0) 

    dbLangGeneral = ';LANGID=0x0409;CP=1252;COUNTRY=0' 
    newdb = workspace.CreateDatabase(dbname, dbLangGeneral, 64) 

    newdb.Execute("""CREATE TABLE Table1 (
         ID autoincrement, 
         Col1 varchar(50), 
         Col2 double, 
         Col3 datetime);""") 

except Exception as e: 
    print(e) 

finally: 
    accApp.DoCmd.CloseDatabase 
    accApp.Quit 
    newdb = None 
    workspace = None 
    dbEngine = None 
    accApp = None 

Python DB API

Alors que le CREATE DATABASE n'est pas disponible dans SQL MS Access, vous pouvez exécuter l'Execute ci-dessus avec une API Python ODBC avec une commande CREATE TABLE seulement après la création du fichier de base de données:

import pypyodbc 

dbname = r'C:/Users/Guest/Desktop/NewDB.mdb'  
constr = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={0};".format(dbname) 

dbconn = pypyodbc.connect(constr) 

cur = dbconn.cursor() 
cur.execute("""CREATE TABLE Table1 (
       ID autoincrement, 
       Col1 varchar(50), 
       Col2 double, 
       Col3 datetime);""") 
dbconn.commit() 
+0

Merci Parfait, exactement ce que je suis après! Je ne peux pas croire que j'ai lutté avec ça pendant si longtemps !!! – WRJ

+0

Lorsque je tente de fermer l'application avec les éléments suivants: 'newdb.Close()' ' accApp.Application.Quit()' ' del accApp' le processus d'accès reste en cours d'exécution et une nouvelle fenêtre d'accès apparaît que refuse de fermer. Savez-vous pourquoi cela arrive? – WRJ

+0

Essayez 'accApp.DoCmd.CloseDatabase; accApp.Quit; accApp = Aucun ». Le dernier est de désinitialiser l'application ou de libérer de la mémoire. – Parfait

0

Il semble que vous allez exécuter une instruction SQL CREATE Table sur l'objet Database à savoir sur newdb, via sa méthode Execute().

Mais je ne recommande pas d'utiliser COM sur MS Access Application objet. Pour une base de données MS Access, la méthode recommandée d'interaction avec la base de données consiste à ouvrir directement la base de données via l'API ODBC plutôt que via une instance Access.Application. Vous ne devez utiliser ce dernier que si vous avez besoin de fonctionnalités telles que des rapports, des impressions, etc. Pour interagir avec le fichier MS Access DB via ODBC, j'ai eu une bonne expérience avec pyodbc et pypyodbc, qui ne nécessitent pas de COM. Un accès de niveau inférieur via DAO API via Win32com (mais pas Access.Application) semble assez bon aussi, mais je n'ai pas essayé. Découvrez http://www.icodeguru.com/WebServer/Python-Programming-on-Win32/ch13.htm pour une bonne discussion sur diverses API de connexion disponibles et quelques exemples de code.

Autres ressources utiles:

    application d'accès
  • ms automation API: les exemples utilisent vba mais win32com fournit même API.
  • introduction à ce qui précède avec des liens pour ADO-based tasks qui n'ont donc pas besoin de l'application d'accès ms: les liens montrent C# mais win32com fournit la même API.
+0

Malheureusement, MS Access contrairement à d'autres SGBD n'a pas la commande SQL 'CREATE DATABASE' donc une interface COM est nécessaire initialement, mais une API DB comme pyodbc de Python, pypyodbc, adodbapi peut être utilisé pour d'autres instructions DML/DDL. En outre, OP peut ne pas avoir le programme GUI .exe. – Parfait

+0

@parfait La question est "Comment ajouter de nouvelles tables à cette base de données", et non "Comment créer une base de données". Basé sur https://msdn.microsoft.com/en-us/library/bb177893(v=office.12).aspx, l'instruction CREATE TABLE est disponible dans MS Access. – Schollii

1
newdb = workspace.CreateDatabase(dbname, dbLangGeneral, 64) 

a déjà créé un objet DAO.Database nommé newdb, donc vous devriez être en mesure d'aller simplement avant et utiliser sa méthode Execute pour exécuter une instruction DDL comme celui-ci

newdb.Execute("CREATE TABLE [Table1] ([ID] COUNTER PRIMARY KEY, [TextField] TEXT(50))")