【问题标题】:pyodbc Access database MSysObjects permissions issuepyodbc 访问数据库 MSysObjects 权限问题
【发布时间】: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 系统表不受支持,确实不适合此。
  • 谢谢@Remou——这看起来很有用。我现在正在研究它
  • 哈,我从没想过会这么简单——cursor.tables() 就像一个魅力。写下来,@Remou——你值得点赞 :-)

标签: python ms-access pyodbc


【解决方案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')]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2013-01-26
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      相关资源
      最近更新 更多