如何通过 Python 3.5.1 创建永久 MS Access Query?

Posted

技术标签:

【中文标题】如何通过 Python 3.5.1 创建永久 MS Access Query?【英文标题】:How to create permanent MS Access Query by Python 3.5.1? 【发布时间】:2016-09-23 13:07:23 【问题描述】:

我有大约 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()

SO,如何从 python 创建和保存 MS Access Query like objects? 我尝试在 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 解决这个问题。

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用CREATE VIEW 语句在 Access 中创建保存的选择查询。与您的 VBA 示例等效的 pyodbc 将是

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

要删除已保存的查询,您只需执行 DROP VIEW 语句即可。

有关 Access 中的 DDL 的详细信息,请参阅

Data Definition Language

【讨论】:

上帝,谢谢。我再问一个问题。如何删除创建的视图?我将感谢有关 CREATE VIEW 等 pyodbc 语句的链接。我在文档中找不到您的信息。【参考方案2】:

考虑运行 VBA 所使用的 VBA 的 Python 等效项:访问对象库的 COM 接口。使用 Python 的win32com 第三方模块,可以调用CreateQueryDef 方法。请注意:此 COM 接口可以应用于 php 和 R 等其他语言!

下面使用try/except/finally 块来确保无论代码错误或成功,Access 应用程序进程都会关闭(类似于VBA 的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

另外,如果您需要通过 pyodbc 而不是 COM 接口运行 DML 语句,请考虑分布式查询,因为 Access 可以直接在 SQL 中查询其他数据库。下面应该在 Python 中工作(一定要转义反斜杠):

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

【讨论】:

Parfait,谢谢,它可以工作,但是 COM 对象有一个大问题,那就是安全选项。就我而言,并不是每个人都有权更改它们。

以上是关于如何通过 Python 3.5.1 创建永久 MS Access Query?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 azure 门户中永久删除旧的 Log-analytics-workspace?

如何在 python 中永久保存列表?

如何永久地将目录附加到PYTHONPATH?

单页应用程序应该如何提供永久链接?

如何在nginx创建临时重定向和永久重定向

使用Python通过Windows身份验证连接到MS SQL Server?