Symfoware

Symfowareについての考察blog

Firebird 2.5.2にPythonから接続する(fdb使用)

FreeBSDにFirebirdをインストールしてみました。
FreeBSD 10.0にFirebird 2.5.2をインストールする(pkg install使用)

Ubuntu + Pythonから接続してみます。


fdbパッケージ



以前はkinterbasdbというパッケージを使用しました。
Debian FirebirdにPythonで接続する(kinterbasdb)

公式ホームページを見てみると、kinterbasdbはobsolete(廃止)されたようです。
Python Driver

代わりに、fdbパッケージを使用すれば良いようです。
https://pypi.python.org/pypi/fdb/

こちらを参考に進めていきます。
http://pythonhosted.org/fdb/



fdbパッケージのインストール



easy_installでインストールしました。


$ sudo easy_install fdb




pythonコンソールで、import fdbしてエラーが出なければ
インストール成功です。


$ python
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fdb
>>>







データベースへの接続




データベースに接続し、テーブルを作成。
適当なサンプルデータを登録して、データを検索してみます。


  1. # -*- coding:utf-8 -*-
  2. import fdb
  3. # コネクション作成
  4. con = fdb.connect(
  5.     dsn='192.168.1.101:/usr/local/firebird/test.fdb',
  6.     user='sysdba',
  7.     password='masterkey',
  8.     charset='UTF8'
  9. )
  10. # カーソル取得
  11. cur = con.cursor()
  12. # サンプルテーブル作成
  13. cur.execute("CREATE TABLE fb_test(id INT, name VARCHAR(100), entry TIMESTAMP)")
  14. con.commit()
  15. # データの登録
  16. cur.execute("INSERT INTO fb_test(id, name, entry) VALUES(1, 'テスト1', '2001/02/03 04:05')")
  17. cur.execute("INSERT INTO fb_test(id, name, entry) VALUES(2, 'テスト2', current_timestamp)")
  18. con.commit()
  19. # 検索
  20. cur.execute("SELECT * FROM fb_test")
  21. for row in cur:
  22.     print("%s, %s, %s" %(row))
  23. ur.close()
  24. con.close()




テーブルを作成した後、一旦commitしないと、INSERT時「Table unknown」の
エラーが発生します。

日付型は、Pythonのdatetimeに変換してくれるようです。
また、現在時刻の指定には「current_timestamp」が使用出来ます。




プレースフォルダ



プレースフォルダを使用しての登録や検索を試してみます。


  1. # -*- coding:utf-8 -*-
  2. import fdb
  3. import datetime
  4. # コネクション作成
  5. con = fdb.connect(
  6.     dsn='192.168.1.101:/usr/local/firebird/test.fdb',
  7.     user='sysdba',
  8.     password='masterkey',
  9.     charset='UTF8'
  10. )
  11. # カーソル取得
  12. cur = con.cursor()
  13. # データの削除
  14. cur.execute("DELETE FROM fb_test")
  15. # データの登録
  16. id = 1
  17. name = 'テストデータ'
  18. entry = datetime.datetime(2010, 1, 2, 3, 4)
  19. cur.execute("INSERT INTO fb_test(id, name, entry) VALUES (?, ?, ?)", (id, name, entry))
  20. id = 2
  21. name = 'テストデータ2'
  22. entry = '2013-04-05 12:34'
  23. cur.execute("INSERT INTO fb_test(id, name, entry) VALUES (?, ?, ?)", (id, name, entry))
  24. # 検索
  25. cur.execute("SELECT * FROM fb_test")
  26. for row in cur:
  27.     print("%s, %s, %s" %(row))
  28. cur.close()
  29. con.close()




日付型はdatetimeをそのまま渡しても良いし、文字列を渡してもよいようです。





結果を辞書型で取得



結果の行を辞書型で取得したい場合は、fetchonemapを使用すれば良いようです。
FDB Reference


  1. # -*- coding:utf-8 -*-
  2. import fdb
  3. import datetime
  4. # コネクション作成
  5. con = fdb.connect(
  6.     dsn='192.168.1.101:/usr/local/firebird/test.fdb',
  7.     user='sysdba',
  8.     password='masterkey',
  9.     charset='UTF8'
  10. )
  11. # カーソル取得
  12. cur = con.cursor()
  13. # データの削除
  14. cur.execute("DELETE FROM fb_test")
  15. # データの登録
  16. id = 1
  17. name = 'テストデータ'
  18. entry = datetime.datetime(2010, 1, 2, 3, 4)
  19. cur.execute("INSERT INTO fb_test(id, name, entry) VALUES (?, ?, ?)", (id, name, entry))
  20. id = 2
  21. name = 'テストデータ2'
  22. entry = '2013-04-05 12:34'
  23. cur.execute("INSERT INTO fb_test(id, name, entry) VALUES (?, ?, ?)", (id, name, entry))
  24. # 検索
  25. cur.execute("SELECT * FROM fb_test")
  26. row = cur.fetchonemap()
  27. while row:
  28.     print("%s, %s, %s" % (row['ID'], row['NAME'], row['ENTRY']))
  29.     row = cur.fetchonemap()
  30. cur.close()
  31. con.close()








BLOBへ画像登録



BLOB列を持つテープルを作成し、画像データを登録してみます。
こちらを参考にしました。
Stream BLOBs


事前に登録用のテーブルを作成しておきます。


CREATE TABLE fb_test(image BLOB SUB_TYPE BINARY)




プログラムはこうなりました。
insert時、ファイルストリームを直接渡せば良いようです。


  1. # -*- coding:utf-8 -*-
  2. import fdb
  3. import datetime
  4. # コネクション作成
  5. con = fdb.connect(
  6.     dsn='192.168.1.101:/usr/local/firebird/test.fdb',
  7.     user='sysdba',
  8.     password='masterkey',
  9.     charset='UTF8'
  10. )
  11. # カーソル取得
  12. cur = con.cursor()
  13. # データの削除
  14. cur.execute("DELETE FROM fb_test")
  15. # 画像データの登録
  16. f = open('Lenna.jpg', 'rb')
  17. cur.execute('INSERT INTO fb_test (image) values (?)',[f])
  18. f.close()
  19. # 検索して復元
  20. cur.execute("SELECT image FROM fb_test")
  21. img = cur.fetchone()[0]
  22. f = open('result.jpg', 'wb')
  23. f.write(img)
  24. f.close()
  25. cur.close()
  26. con.close()





実行してみると、ちゃんと登録した画像が復元出来ました。

353_01.png
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/03/08(土) 18:57:55|
  2. Firebird
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Firebird 2.5.2にPHPから接続する(PDO_FIREBIRD) | ホーム | Firebird embedded 2.5.2で接続した時のアクセス権メモ>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1315-2b6213b9
この記事にトラックバックする(FC2ブログユーザー)