2016-10-12 7 views
2

Я пытаюсь создать базу данных Access в Python и добавить к ней две новые таблицы. Я использую win32com и сумел создать базу данных, но не могу создать таблицы. Все, что я получаю, - бесполезные ошибки Windows. Может кто-нибудь мне помочь?Создать новую базу данных доступа и таблицы с помощью Python

Следующий код работает отлично:

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) 

Как добавить новые таблицы в этой базе данных?

+0

Какая версия ms доступа? В docssuggest вы используете устаревший способ открытия базы данных, если ms доступ 2000 или после. – Schollii

+0

Привет, Schollii, я пытаюсь создать 2002 - 2003 mdb – WRJ

ответ

3

Потому что MS Доступ - это приложение GUI .exe и база данных базы данных для создания базы данных - это другой процесс, чем создание объектов базы данных, таких как Таблицы, Виды (т. Е. Сохраненные запросы) и даже Процедуры.

Для сравнения, на другом RDMS на уровне файлов, SQLite, необходимо открыть его .exe-оболочку до CREATE DATABASE. И серверные RDMS (SQL Server, MySQL, Postgres) должны войти в экземпляр сервера для запуска команды. MS Access не имеет средств оболочки или экземпляра, просто объект приложения.

Поэтому, создав базу данных с помощью метода CreateDatabase, подумайте о том, чтобы запустить инструкцию DDL SQL до CREATE TABLE, которую вы можете сделать с помощью метода Execute().

Python COM интерфейс

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

Хотя CREATE DATABASE не доступен в MS Access SQL вы можете запустить выше Execute с любым Python ODBC API с помощью команды CREATE TABLE только после создания файла базы данных:

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

Спасибо, Parfait, именно то, что мне нужно! Не могу поверить, что я так долго боролся с этим !!! – WRJ

+0

При попытке закрыть приложение со следующим: 'newdb.Close()' ' accApp.Application.Quit()' ' дель accApp' процесс доступа продолжает работать и в новом окне Access представляется, что отказывается закрыться. Вы знаете, почему это происходит? – WRJ

+0

Попробуйте 'accApp.DoCmd.CloseDatabase; accApp.Quit; accApp = None'. Последнее состоит в том, чтобы uninitialize приложение или выпуск из памяти. – Parfait

0

Похоже, вы бы выполнить SQL заявление CREATE Table на Database объекта, т.е. на newdb, через его метод Execute().

Но я не рекомендую использовать COM на MS Access Приложение объект. Для базы данных MS Access рекомендуемым методом взаимодействия с БД является непосредственное открытие БД через API ODBC, а не через экземпляр Access.Application. Вы должны использовать только последний, если вам нужны функции из приложения, такие как отчеты, печать и т. Д. Для взаимодействия с файлом DB Access Access через ODBC у меня был хороший опыт работы с pyodbc и pypyodbc, которые не требуют COM. Доступ к более низкому уровню через API DAO через win32com (но не Access.Application) тоже кажется неплохим, но я не пробовал. Отъезд http://www.icodeguru.com/WebServer/Python-Programming-on-Win32/ch13.htm для хорошего обсуждения различных API соединений и некоторых примеров кода.

Другие полезные ресурсы:

  • мс приложение automation API доступа: примеры использования VBA, но win32com обеспечивает тот же интерфейс.
  • Вступительное слово, приведенное выше, с ссылками на ADO-based tasks, что поэтому не требует приложения доступа ms: ссылки показывают C#, но win32com предоставляет тот же API.
+0

К сожалению, MS Access, в отличие от других СУБД, не имеет команды SQL CREATE DATABASE, поэтому сначала требуется интерфейс COM, но затем API DB, такой как podybp python, pypyodbc, adodbapi может использоваться для других операторов DML/DDL. Кроме того, OP может не иметь программу GUI .exe. – Parfait

+0

@parfait Вопрос: «Как добавить новые таблицы в эту базу данных», а не «Как создать базу данных». На основе https://msdn.microsoft.com/en-us/library/bb177893(v=office.12).aspx оператор CREATE TABLE доступен в MS Access. – Schollii

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

уже создали объект с именем DAO.Database newdb, так что вы должны быть в состоянии просто идти вперед и использовать его метод Execute запустить DDL заявление как этот

newdb.Execute("CREATE TABLE [Table1] ([ID] COUNTER PRIMARY KEY, [TextField] TEXT(50))") 
Смежные вопросы