トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

E71:e32dbmモジュールを使ってみた

Last-modified: 2013-08-24 (土) 02:14:21 (2216d)
Top / E71:e32dbmモジュールを使ってみた

E71:e32dbmモジュールを使ってみた

PyS60には、e32dbとe32dbmという2種類のS60ネイティブのDBモジュールがあります。

簡単に違いを説明すると

e32db
データをSQLを使って操作
e32dbm
データを辞書感覚で操作

・・・簡単すぎないか?笑

まあまあ、気が向いたら詳細に解説しようかと思います。

ちなみに、実際使ってみると、テキスト処理をしなくてもデータをファイルに保存したり、引っこ抜いた入りできるので、アプリの設定を保持したい場合とかに便利かな~と思います。

e32dbmを使ってみる。

オーソドックスに、IntaractiveConsol?から操作してみます。

まずは、モジュールをインポートします。

>>> import e32dbm
>>> 

次に、モジュールのopen関数を使って、DBをオープンします。

この関数の戻り値として、「e32dbm」オブジェクトが取得できます。

この「e32dbm」オブジェクトが、辞書感覚で使えるDBとなります。

>>> cfg=e32dbm.open(u'e:\\testcfg.db','c')
Traceback (most recent call last):
  File "<console>", line 1, in ?
  File "c:\resource\e32dbm.py", line 258, in open
    if flags[0] == 'c' and not os.path.exists(filename):
  File "c:\resource\ntpath.py", line 142, in exists
    st = os.stat(path)
UnicodeError: ASCII encoding error: ordinal not in range(128)

おっと、エラーが出てしました。

これは、字面的には間違ってないのですが、エンコーディングエラーが出てます。

なんか、+JforS60を使っている場合は、色々都合がよろしくないようですので、+JforS60の「有効なFEP」を「標準FEP」に変更して実施してください。

さてさて、標準のFEPに変更したあともう一度やってみるとエラーなく実行できます。

>>> cfg = e32dbm.open(u'e:\\testcfg.db','c')
>>> 

openメソッドの引数は以下の通り。

第一引数
e32dbmファイルのフルパス(ユニコード指定)
第二引数
フラグ指定(省略可)fを指定すると、非同期ファイル更新となる。ファイルを更新するためにはsyncclosereorganizeclearのいずれかのメソッドを実行する。指定しない場合(デフォルト)は、同期ファイル更新となる。
第三引数
モード指定(省略可)指定しない場合(デフォルト)は、rとなる。
r
読み取り専用モードでファイルをオープン
w
読み書きモードでファイルをオープン
c
読み書きモードでファイルをオープン(ファイルがない場合新規作成し、ファイルをオープン)
n
空のDBを作成し、読み書きモードでオープン

このオブジェクトを見てみましょう。

>>> dir(cfg)
['__del__', '__delitem__', '__doc__', '__getitem__', '__init__', '__iter__',
 '__len__', '__module__', '__setitem__', '_dbclear', '_dbdel', '_dbget', 
'_dbhaskey', '_dbset', '_execute', '_query', 'clear', 'close', 'db', 'fast', 
'flags', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 
'keys', 'pending_updates', 'pop', 'popitem', 'reorganize', 'setdefault', 
'sync', 'update', 'values']

へー、確かに、辞書と同じものもある。

ではでは、要素を追加してみましょう。

>>> cfg.items()
[]
>>> cfg['a']='aaa'
>>> 
>>> cfg.items()
[('a', 'aaa')]
>>> cfg.get('a')
'aaa'

ふむふむ、確かに出来てる。

じゃあ、一回コンソールを閉じて、もう一度ファイルを開いてちゃんと書き込まれているか確認してみましょう。

Python 2.2.2 (#0, Nov  7 2008, 14:24:30) [C] on symbian_s60 Type "copyright",
 "credits" or "license" for more information.
(InteractiveConsole)
>>> import e32dbm
>>> 
>>> cfg = e32dbm.open(u'e:\\testcfg.db','w')
>>> 
>>> cfg.items()
[('a', 'aaa')]
>>> 

うむ、ちゃんと書き込まれてる!