環境
サーバ
FileMaker 11 server Advanced
クライアント
Visual Studio Community 2015 (Python toolsインストール済)
Anaconda 32bit(odbcドライバの関係で必ず32bitでなければならない。インストール時に工夫すれば32bitと64bitは併存出来る)
こちらの方を参考にしました。
http://qiita.com/kyo-bad/items/75d88ce77660e3fa158c
設定
FileMakerServer
・FileMaker Serverはadvancedバージョンであること(通常版はODBC接続が出来ない)
・ODBCの設定や対象のファイルに共有設定等も行っているものとする
Python3
・Anaconda 32bitを使用(FileMaker11ではODBCドライバが32bitしかなかったので)
・もしAnacondaの64bitがメインとしてインストールされている場合、
ツール(T) -> オプション(O)...
Python Tools->Environment Options
で新しく32bitの設定を作って、
プロジェクト(P) -> (プロジェクト名)のプロパティ(E)...
General -> Interpreter:
を作った設定にする。
ODBC
・FileMakerに同封のODBCインストーラでインストール
・DSNを設定する場合は、64bitではなく32bitで設定すること「C:\Windows\SysWOW64\odbcad32.exe」で設定が可能。(必ずしも必要な作業ではない)
http://filemaker-jp.custhelp.com/app/answers/detail/a_id/9974/~/64-ビット版-windows-環境での-odbc-接続について
コード
成功
事前準備としてpypyodbcをインストールしておくこと。
%windir%\system32\cmd.exe "/K" "C:\Anacondaインストール先\Scripts\activate.bat" "C:\Anacondaインストール先"
pip install pypyodbc
# !/usr/bin/env python
# -*- coding: utf-8 -*-
### coding: utf-8 の部分は、書類のコーディングに依存する
### ファイル(F)->保存オプションの詳細設定(V)...
### で書類のコーディングが変更可能
### この場合「Unicode(UTF-8シグネチャなし)-コードページ65001」
### SHIFT-JISの場合はcp932
import pypyodbc
def pypy():
cnn = pypyodbc.connect('DRIVER={FileMaker ODBC};SERVER=192.168.XXX.XXX:2399;UID=USER_NAME;PWD=PASSWORD;DATABASE=ファイルメーカー.fp7')
cur = cnn.cursor()
#日本語フィールドの場合、かならずダブルクォーテーションで囲む必要があります。
cur.execute("SELECT \"ID\",\"名前\" from \"テーブル名\" WHERE \"ID\" = 番号")
rows = cur.fetchall()
for row in rows:
print(row[1])
cur.close()
cnn.close()
if __name__ == "__main__":
pypy()
・文字コードはutf-8でもcp932でも良いが、# -- coding: utf-8 --の部分を合わせること。
失敗
もしかしたら、自分の設定が間違っていただけなのかもしれないが、下記設定ではプログラムが通らなかった。特に日本語が絡むと通りにくくなる。
pyodbc
import pyodbc
pyodbc.connect(接続)で、接続は出来たが、
cursor.execute(クエリ)で日本語フィールドが含まれる場合、どうしても
'utf-8' codec can't decode byte 0x8e in position 0: invalid start byte
といったエラーが発生して取得ができなかった(.encode('utf-8')等でエンコード、デコードしたり、書類のコーディングを変えても同じ)
ADO
import win32com.client
# DBConnection=win32com.client.Dispatch('ADODB.Connection')
# DBConnection.Open(ConnectionString)
コードは通るが、XXX.Fields.Item(i).Valueで文字列の値が全く拾えない
PyFileMaker
Python3未対応