2016-09-23 3 views
3

У меня около 40 баз данных MS Access и есть некоторые проблемы, если вам нужно создать или передать один из запросов MS Access (например, объект) от одного db к другому dbs. Итак, я попытался решить эту проблему с помощью pyodbc, но .. как я увидел pyodbc не поддерживает создание нового, постоянного запроса на доступ к MS Access (object). Я могу подключиться к db, создавать или удалять таблицы/строки, но не могу создать и сохранить новый запрос.Как создать постоянный запрос на доступ к MS Python 3.5.1?

import pyodbc 

odbc_driver = r"{Microsoft Access Driver (*.mdb, *.accdb)}" 

db_test1 = r'''..\Test #1.accdb''' 
db_test2 = r'''..\Test #2.accdb''' 
db_test3 = r'''..\Test #3.accdb''' 
db_test4 = r'''..\Test #4.accdb''' 

db_test_objects = [db_test1, db_test2, db_test3, db_test4] 

odbc_conn_str = "Driver=%s;DBQ=%s;" % (odbc_driver, db_file) 
print (odbc_conn_str) 

conn = pyodbc.connect(odbc_conn_str) 
odbc_cursor = conn.cursor() 

NewQuery = "CREATE TABLE TestTable(symbol varchar(15), leverage double)" 

odbc_cursor.execute(NewQuery) 
conn.commit() 
conn.close() 

С.О., Как создать и сохранить MS Access Query как объекты из питона? Я попытался найти информацию в Google, но ответы были связаны с Запустить код SQL.

На VBA этот код выглядит следующим образом:

Public Sub CreateQueryDefX() 

    Dim base(1 To 4) As String 
    base(1) = "..\Test #1.accdb" 
    base(2) = "..\Test #2.accdb" 
    base(3) = "..\Test #3.accdb" 
    base(4) = "..\Test #4.accdb" 

    For i = LBound(base) To UBound(base) 
    CurrentBase = base(i) 
    Set dbo = OpenDatabase(CurrentBase) 
     With dbo 
     Set QueryNew = .CreateQueryDef("TestQuery", _ 
     "SELECT * FROM TestTable") 
     RefreshDatabaseWindow 
     .Close 
     End With 
    Next i 

RefreshDatabaseWindow 

End Sub 

Извините за мой английский, это не мой родной :)

Кстати, я знаю, как решить эту проблему с помощью VBA, но я заинтересованы в решении этой проблемы с помощью python.

спасибо.

ответ

5

Вы можете использовать оператор CREATE VIEW для создания сохраненного запроса выбора в доступе. Pyodbc эквивалентно вашему примеру VBA будет

crsr = conn.cursor() 
sql = """\ 
CREATE VIEW TestQuery AS 
SELECT * FROM TestTable 
""" 
crsr.execute(sql) 

Чтобы удалить этот сохраненный запрос можно просто выполнить DROP VIEW заявление.

Для получения дополнительной информации о DDL в доступе см

Data Definition Language

+0

Горд, спасибо. Я задал бы еще один вопрос. Как удалить созданный вид? Я буду благодарен за ссылку на заявления о пиодбке, такие как CREATE VIEW и другие. Я не мог найти вашу информацию в документации. – kn9ka

+0

@ kn9ka - Я обновил свой ответ. –

1

Рассмотрим эквивалент Python в VBA работает именно то, что использует VBA: СОМ-интерфейс к библиотеке объектов доступа. С сторонним модулем win32com Python вы можете вызвать метод CreateQueryDef. Обратите внимание: этот интерфейс COM может применяться на других языках, таких как PHP и R!

Ниже использует try/except/finally блока для обеспечения процесс приложения Access закрывается независимо от ошибки или успеха коды (аналогично On Error обработки УВЫ):

import win32com.client 

# OPEN ACCESS APP AND DATABASE 
dbases = ["..\Test #1.accdb", "..\Test #2.accdb", "..\Test #3.accdb", "..\Test #4.accdb"] 

try: 
    oApp = win32com.client.Dispatch("Access.Application") 

    # CREATE QUERYDEF 
    for db in dbases: 
     oApp.OpenCurrentDatabase(db) 
     currentdb = oApp.CurrentDb() 
     currentdb.CreateQueryDef("TestQuery", "SELECT * FROM TestTable") 
     currentdb = None 
     oApp.DoCmd.CloseDatabase 

except Exception as e: 
    print(e) 

finally: 
    currentdb = None 
    oApp.Quit 
    oApp = None 

Кроме того, если вам нужно запускать операторы DML через pyodbc, а не COM-интерфейс, рассмотрите распределенные запросы, поскольку Access может запрашивать другие базы данных непосредственно в SQL. Ниже следует работать на Python (обязательно избегайте обратной косой черты):

SELECT t.* FROM [C:\Path\To\Other\Database.accdb].TestTable t 
+0

Parfait, Спасибо, это работает, но COM-объекты имеют одну большую проблему, это параметры безопасности. В моем случае не все имеют права изменять их. – kn9ka