pyodbc访问数据库MSysObjects权限问题

2024-05-29 03:04:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用pyodbc访问access数据库(.mdb)。在

我可以很好地连接到它-

connection = pyodbc.connect(driver='{Microsoft Access Driver (*.mdb)}', dbp=path, pwd=password)

但是我无法查询MSysObjects来获取其表的列表-

^{pr2}$

它给了我-

Record(s) cannot be read; no read permission on 'MSysObjects'. (-1907) (SQLExecDirectW)

浏览一下,似乎是因为数据库被“保护”了。在

我无法运行Access来更改它。有什么地方我可以用程序解决这个问题吗?我需要知道数据库的用户吗?在

I've seen a workaround in Visual Basic-我有没有办法在Python中使用它?我想我需要一个不同的库(OLEDB)。在

谢谢!在


Tags: path数据库readaccessdriverconnectpwdconnection
2条回答

我意识到我来晚了,但我最近也遇到了同样的问题,我想分享一下我为获取表/列模式而编写的函数。在

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)

我们的想法是,稍后可以将数据元组附加到具有列名的列表中:

^{pr2}$

解决方案是使用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']

可能有一种更简洁的编码方式,但我很赶时间;)

(感谢那些对原始问题发表评论的人;我只是发布了这段代码,因为我正在把它写进我的笔记中)

相关问题 更多 >

    热门问题