我有大约40个MS Access数据库,如果需要从一个db创建或传输MS Access Query(如对象)之一到其他dbs,则会遇到一些麻烦。
所以我尝试用pyodbc
来解决这个问题但是......因为我看到pyodbc
并不支持创建新的永久MS Access Query(对象)。
我可以连接到db,创建或删除表/行但不能创建和保存新查询。
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 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来解决这个问题。
谢谢。
答案 0 :(得分:5)
您可以使用CREATE VIEW语句在Access中创建已保存的选择查询。与您的VBA示例等效的pyodbc将是
crsr = conn.cursor()
sql = """\
CREATE VIEW TestQuery AS
SELECT * FROM TestTable
"""
crsr.execute(sql)
要删除保存的查询,您只需执行DROP VIEW语句。
有关Access中DDL的更多信息,请参阅
答案 1 :(得分:1)
考虑运行VBA正好运行的VBA的Python等价物:Access对象库的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