如何通过 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?的主要内容,如果未能解决你的问题,请参考以下文章