我正在尝试使用.mdb
访问Access数据库(pyodbc
)。
我可以很好地连接到它 -
connection = pyodbc.connect(driver='{Microsoft Access Driver (*.mdb)}', dbp=path, pwd=password)
但我无法查询MSysObjects
以获取其表格列表 -
cursor = connection.cursor()
cursor.execute('select * from MSysObjects where Type=1 and Flags=0')
它给了我 -
Record(s) cannot be read; no read permission on 'MSysObjects'. (-1907) (SQLExecDirectW)
浏览,似乎是因为数据库已被“保护”。
我无法运行Access来更改它。有没有我可以以编程方式解决这个问题?我是否需要了解数据库用户或类似的东西?
I've seen a workaround in Visual Basic - 我有没有办法在Python中适应它?我想我需要一个不同的库(OLEDB)。
谢谢!
答案 0 :(得分:3)
解决方案是使用cursor.tables()
,如下面的代码段所示:
import pyodbc
connection = pyodbc.connect(driver='{Microsoft Access Driver (*.mdb)}', dbp=path, pwd=password)
cursor = connection.cursor()
tableNames = [x[2] for x in cursor.tables().fetchall() if x[3] == 'TABLE']
这可能是一种更清晰的编码方式,但我很着急;)
(归功于那些对原始问题发表评论的人;我刚刚发布了这段代码,因为我还是将其写入我的笔记中)
答案 1 :(得分:0)
我意识到我迟到了,但我最近遇到了同样的问题,并且认为我会分享我为获取表/列架构而编写的函数。
def get_schema(cursor):
"""
:param cursor: Cursor object to database
:return: Dictionary with table name as key and list of columns as value
"""
db_schema = dict()
tbls = cursor.tables().fetchall()
for tbl in tbls:
if tbl not in db_schema:
db_schema[tbl] = list() # add table as key
column_names = list()
for col in cursor.columns(table=tbl): # concatenate column names
column_names.append(col[3])
db_schema[tbl] = tuple(column_names) # store column names as value
return dict(db_schema)
您的想法是,您可以稍后将数据元组附加到具有列名称的列表中:
{'Table 1': [('Column 1-1', 'Column 1-2')],
'Table 2': [('Column 2-1', 'Column 2-2', 'Column 2-3')]}