qshinoの日記

Powershell関係と徒然なこと

簡易db on python

import pickle


class Sdb:
  def __init__(self):
    self.db = {} # dict
  def add(self,name,val):
    self.db[name] = val
  def val(self,name):
    return self.db[name]

class Pdb(Sdb):
  file="dbname"
  def load(self):
     with open(file,'r') as f:
        self.a = pickle.load(f)
     return self.a
   def dump(self):
      with open(file,'wb') as f:
         pickle.dump(self, f)

利用方法

$ cmd1 | sdb  # regist & embed
$ cmd1 > a    # save raw
$ sdb -f a     # regist & embed
$ sdb -l       # show list
$ cmd2 -name `sdb 3` params # show id

利用頻度

  1. パイプ
  2. 埋め込み
  3. 読み込み
  4. リスト

利用頻度を考慮した、実装の選択。 パイプを最も早く実行する実装を検討する。 操作は、name =〉id 変換。

csv: 全リード後に辞書検索。 sql: maclistで検索し、辞書化し検索。

db実装

  1. csv file - edb - csv リードライト面倒
  2. json file
  3. pickle file
  4. sqlite3 - minidb 毎回sqlは効率悪そう

sqlの場合

# nameを読み込み、names dict作成

# names =(name:-1, ...)
# name のidを検索

sql="select id,name from tab where name in ( ? ) " 
para = ",".join(names.keys())

for x in c.execute(sql, para):
  id = x[0]
  name = x[1]
  names[name]= id

# 新規nameを検索し登録
# 新規nameのidを取得
# 出力時に、name とid を出力。

sql の例2

  1. 入力読み込み。
  2. 新規nameを登録。 insert into tab(name) select name from tab where not exists (select id from tab where name = ?)
  3. selectでid取得。
  4. id,nameを出力。