Windows10上のPythonでAccessのDBを参照する

## mdb形式のファイルをPythonから参照したい
ふだんは、MacOSを使っているのでWindows環境でAccessのDBを単にselectするだけのツールならpythonであっという間にできるのではないかと考えたのですが、自分の知識と能力のレベルを感じた記録です
現在はまだ**接続ができたところ**までです

### 経緯
*Visual Studio*を使用しVisualBasicでAccessDBを参照するツールを作成してあった。
キーを入力して値を表示するだけの10行程度のツールなのですが、
そのためにVisual Studioの環境を整えないとなりませんでした。
『Visual Studioをインストールする方法』という記事もあるくらいで手間がかかります。もう少しこの部分の手間を省けないかと考えた経緯を記録しときます。
※　とはいえ、結果として**手間**という部分に関しては改善できたのかは疑問です:sweat:
振り返ってみると[YottaGinさんのページ](https://yottagin.com/?p=2909)で書かれていらっしゃることそのままに、私が躓いたことを補足した記事になっています。

### 環境
 ・Windows10  64Bit
 ・Python3.8.0
 ・Access2019 64ビット
### 手順
#### pythonライブラリpyodbcのインストール
pip instlallではダメだった（さらっとできている記事もありますが...）
pip install pyodbc でインストール

```
C:\Users\hoge\Documents> pip install pyodbc
```
pythonでimportしてみると

```
>>> import pyodbc
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing pyodbc: 指定されたモジュールが見つかりません。
```
ここ https://ja.programqa.com/question/23642636/ を参考にwhlファイルをダウンロードして実行
http : //www.lfd.uci.edu/~gohlke/pythonlibs/#pyodbc
pyodbc‑4.0.28‑cp38‑cp38‑win_amd64.whl
をダウンドードして、ダブルクリックするとインストールされて、pip listで表示された。

```
C:\Users\hoge\Documents>pip list
Package         Version
--------------- -------
cycler          0.10.0
kiwisolver      1.1.0
matplotlib      3.1.2
numpy           1.17.4
pip             19.3.1
pyparsing       2.4.5
python-dateutil 2.8.1
six             1.13.0

### ここでダウンロードしたpyodbc‑4.0.28‑cp38‑cp38‑win_amd64.whlをダブルクリック

C:\Users\hoge\Documents>pip list
Package         Version
--------------- -------
cycler          0.10.0
kiwisolver      1.1.0
matplotlib      3.1.2
numpy           1.17.4
pip             19.3.1
pyodbc          4.0.28  <=== これが追加されている
pyparsing       2.4.5
python-dateutil 2.8.1
six             1.13.0
```

#### アクセスODBCドライバのインストール状況の確認
importのエラーは解消したが、DBに接続しようとすると下記の状況になった。

```
pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
```
エラーメッセージから検索し、こちらYottaGinさんのページ https://yottagin.com/?p=2909 で教えていただきました。
Pythonのインタラクティブモードでドライバのインストール状況を確認します。

```
>>> import pyodbc
>>> [x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')]
[]
```

結果によって行う作業が決まります
・空のリスト
　　64ビットバージョンのACEドライバをインストールする。
・[‘Microsoft Access Driver (*.mdb)’]
　　.accdbファイルを扱う場合は、32ビットバージョンのACEドライバをインストールする。
・[‘Microsoft Access Driver (*.mdb, *.accdb)’ ]
　　既にドライバはインストールされているので必要ない。

上記の**環境**に書いたようにAccessはインストールされているPCなので、ドライバはあるだろうと思ったら、え？なかった

#### アクセスODBCドライバのインストール

https://www.microsoft.com/ja-jp/download/details.aspx?id=13255
から『Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント』 
から64Bitの方をダウンロードし、ダブルクリック、画面の指示に従って、インストールした。

ダウンロード後にpythonのインタラクティブモードで確認すると、反映されていました。

```
>>> [x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')]
['Microsoft Access Driver (*.mdb, *.accdb)']
```

#### データベースの参照

##### 下記のソースでselectを実行

```
import sys
sys.path.append(r"C:\users\hoge\appdata\local\packages\pythonsoftwarefoundation.python.3.8_qbz5n2kfra8p0\localcache\local-packages\python38\site-packages") 
import pyodbc

con_str = 'Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};Dbq={0};'.format(r"C:\Users\hoge\Documents\testDB1.mdb")
conn = pyodbc.connect(con_str)
cur = conn.cursor()
sql_create_table = ('select * from testTBL;')
cur.execute(sql_create_table)
for row in cur.fetchall():
   print(row)
```
##### 参照するデータベース
![スクリーンショット 2020-01-08 12.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/61c3111f-dbcf-40c1-41d7-9a881d2342c6.png)


##### 実行結果

```
C:\Users\hoge\Documents>python pythonDB_Access.py
('001', 'AAA')
('002', 'BBB')
('003', 'CCC')
```

### 次のステップ
ここまでできれば、あとはPythonとSQL文の世界なので、いつものようにやればいいだけですね

#### おまけ　データベースの作成
今回はAccessがインストールされているPCでしたので、テスト用のDBも作ることができましたが、Accessなんて無い！ということもままあるわけでして、その時のことも前述のYottaGinさんのページではご説明していただいてくださっていました。
モジュール[msaccessdb](https://github.com/gordthompson/msaccessdb)を使えばAccessが無い環境でも、テスト用DBは作成できるようです