pyodbc 访问数据库 MSysObjects 权限问题

Posted

技术标签:

【中文标题】pyodbc 访问数据库 MSysObjects 权限问题【英文标题】:pyodbc Access database MSysObjects permissions issue 【发布时间】:2012-06-15 11:10:41 【问题描述】:

我正在尝试使用 pyodbc 访问 Access 数据库 (.mdb)。

我可以正常连接——

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)。

谢谢!

【问题讨论】:

您不能从连接中获取架构吗? Access 系统表不受支持,确实不适合此。 或许:***.com/questions/4539254/… 谢谢@Remou——这看起来很有用。我现在正在研究它 哈,我从没想过会这么简单——cursor.tables() 就像一个魅力。写下来,@Remou——你值得点赞 :-) 【参考方案1】:

解决方案是使用cursor.tables(),如下面的code-sn-p所示:

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']

可能有一种更简洁的编码方式,但我很着急;)

(感谢那些对原始问题发表评论的人;我刚刚发布了这段代码,因为无论如何我都要把它写到我的笔记中)

【讨论】:

【参考方案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)

这个想法是您以后可以将数据元组附加到具有列名的列表中:

'Table 1': [('Column 1-1', 'Column 1-2')],
 'Table 2': [('Column 2-1', 'Column 2-2', 'Column 2-3')]

【讨论】:

以上是关于pyodbc 访问数据库 MSysObjects 权限问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyodbc 连接到链接访问数据库

在 ms 访问中看不到由 pyodbc 创建的表

通过 sqlalchemy 和 pyodbc 访问 MS SQL 数据库时出现“登录超时”错误

Python pyodbc 连接到 ms 访问数据库

Access2010打开系统表MSysObjects的控制权限

32 位 pyodbc 读取 64 位访问 (accdb)