4

.mdbを使用して Access データベース ( )にアクセスしようとしていますpyodbc

うまく接続できます—</p>

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

しかし、クエリMSysObjectsを実行してそのテーブルのリストを取得することはできません—</p>

cursor = connection.cursor()
cursor.execute('select * from MSysObjects where Type=1 and Flags=0')

</p>

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

ブラウズすると、データベースが「保護」されていることが原因のようです。

Access を実行して変更できません。これをプログラムで解決できる場所はありますか? データベースのユーザーなどを知る必要がありますか?

Visual Basic で回避策を見たことがあります — Python でそれを適応させる方法はありますか? 別のライブラリ(OLEDB)が必要だと思います。

ありがとう!

4

2 に答える 2

5

解決策は、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']

おそらくこれをコーディングするよりクリーンな方法がありますが、私は急いでいます ;)

(クレジットは元の質問にコメントした人に送られます。とにかくメモに書いているので、このコードを投稿しました)

于 2014-12-04T05:26:21.657 に答える
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')]}
于 2016-02-11T20:27:12.413 に答える