如何使用Python 3.5.1创建永久MS Access查询?

如何使用Python 3.5.1创建永久MS Access查询?,python,vba,ms-access,pyodbc,Python,Vba,Ms Access,Pyodbc,我有大约40个MS Access数据库,如果需要创建或将一个MS Access查询(如对象)从一个数据库传输到另一个数据库,我会遇到一些问题。 所以我尝试用pyodbc解决这个问题,但是。。正如我看到的那样,pyodbc不支持创建新的、永久的MS Access查询(对象)。 我可以连接到数据库,创建或删除表/行,但不能创建和保存新查询 import pyodbc odbc_driver = r"{Microsoft Access Driver (*.mdb, *.accdb)}" db_te

我有大约40个MS Access数据库,如果需要创建或将一个MS Access查询(如对象)从一个数据库传输到另一个数据库,我会遇到一些问题。 所以我尝试用
pyodbc
解决这个问题,但是。。正如我看到的那样,pyodbc不支持创建新的、永久的MS Access查询(对象)。 我可以连接到数据库,创建或删除表/行,但不能创建和保存新查询

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()
那么,如何从python中创建和保存类似MS Access Query的对象呢? 我试图在谷歌搜索信息,但答案与运行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解决这个问题感兴趣

谢谢。

您可以使用语句在Access中创建保存的Select查询。与VBA示例相当的pyodbc是

crsr=conn.cursor()
sql=”“”\
创建视图TestQuery作为
从测试表中选择*
"""
crsr.execute(sql)
要删除保存的查询,只需执行一条语句

有关Access中DDL的更多信息,请参阅


考虑一下运行VBA的Python等价物:Access对象库的COM接口。使用Python的
win32com
第三方模块,您可以调用该方法。注意:这种COM接口可以应用于其他语言,如PHP和R

下面使用
try/except/finally
块来确保访问应用程序进程关闭,而不管代码是否错误或成功(类似于VBA的
错误处理
):


此外,如果需要通过PyoBoc而不是COM接口运行DML语句,则将分布式查询视为Access可以在SQL中直接查询其他数据库。以下内容应在Python中使用(请确保避开反斜杠):

从[C:\Path\To\Other\Database.accdb].TestTable t中选择t.*

Gord,谢谢。我能再问一个问题吗。如何删除已创建的视图?我将非常感谢有关pyodbc语句的链接,如createview和other。我在文档中找不到您的信息。Parfait,谢谢,它可以工作,但COM对象有一个大问题,那就是安全选项。在我的情况下,不是每个人都有权更改它们。
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