python で database クラスを作ってみる (Part 5)

今回は、複雑な SELECT 文に対応する select_custom 関数を追加して、簡単なテーブルでテストをしてシリーズ最後にします。

select_custom 関数は、引数 sql にパラメータ(%s)付きSQLステートメント、bind にパラメータの値リストを渡します。

class SimpleDB(object):
... (省略)...

    def select_custom(self, sql, bind):
        result = None

        if self.__cursor is not None:
            self.__cursor.execute(sql, bind)
            columns = self.__cursor.description
            result = []
            for row in self.__cursor.fetchall():
                item = {}
                for (index, value) in enumerate(row):
                    item[columns[index][0]] = value
                result.append(item)
        return result
    ## End def select_custom

... (省略)...
## End class

次に、SimpleDBクラスで、テーブルへデータ登録、更新、削除、そして選択してテストします。

テーブル名は t_test でテーブル定義は以下です。

CREATE TABLE t_test (
     id                int NOT NULL AUTO_INCREMENT
    ,name              varchar(260) NULL
    ,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

以下、テスト用コードです。

if __name__ == '__main__':
    dbconfig = {
        "host": "localhost",
        "database": "<your database>",
        "user": "<your username>",
        "password": "<your secure password>"
        }

    try:
        db = SimpleDB(dbconfig['host'], dbconfig['database'], dbconfig['user'], dbconfig['password'])
        db.open()

        # insert
        data = { 'name' : '山田 太郎' }
        rowid = db.insert("t_test", data)
        print "rowid: %d" % rowid


        # select
        conditions = { 'id' : rowid }
        res = db.select("t_test", conditions, "id", True)
        if res is not None:
            for r in res:
                print "select : %s, %s" % (r['id'], r['name'])

        # select_custom
        bind = [ rowid ]
        res = db.select_custom("select * from t_test where id = %s order by id", bind)
        if res is not None:
            for r in res:
                print "select_custom : %s, %s" % (r['id'], r['name'])

        # update
        conditions = { 'id' : rowid }
        data = { 'name' : '山田 花子' }
        rows_affected = db.update("t_test", data, conditions)
        print "%d 件更新" % rows_affected

        # select all
        conditions = None
        res = db.select("t_test", conditions, "id", True)
        if res is not None:
            for r in res:
                print "select : %s, %s" % (r['id'], r['name'])

        # delete
        conditions = { 'name' : '山田 花子' }
        rows_affected = db.delete("t_test", conditions)
        print "%d 件削除" % rows_affected

        # select all
        conditions = None
        res = db.select("t_test", conditions)
        if res is not None:
            for r in res:
                print "select : %s, %s" % (r['id'], r['name'])
        
        db.close()
    except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        print "%s, %s, %s" % (exc_type, fname, exc_tb.tb_lineno)

実行結果:

# python simpledb.py 
rowid: 15
select : 15, 山田 太郎
select_custom : 15, 山田 太郎
1 件更新
select : 15, 山田 花子
1 件削除

参考までに:

SimpleDBクラスのソース: simpledb.py
(ファイル名を simpledb.py_.txt から “simpledb.py” に変更してください。)

sdelete – Windowsでファイルを完全に消去するコマンド

Windows でファイルを完全に消去するために sdelete というコマンドツールが無償でMicrosoft TechNetから提供されています。sdelete はWindows Sysinternalsのツール群のひとつです。

このコマンドで削除したファイルはディレクトリはファイルの復元ソフトなどで復元されることがなくなるため、安全に削除する場合には必要なツールです。

このコマンドを使った便利なライフハックがありましたのでご紹介します。

Windows Sysinternalsをダウンロードして C:\sysinternals へ展開しておきます。

まず、License Agreement に同意する必要があります。コマンドプロンプトから C:\sysinternals へ移動して sdelete.exe を実行します。

> cd sysinternals
> sdelete

License Agreement のダイアログが表示されますので、内容を確認の上、Agree ボタンをクリックします。
2回目以降はこのダイアログは表示されません。

次に、このコマンドを実行するバッチファイルを作成します。メモ帳を立ち上げて以下の内容を書き込みます。

@echo off
echo .* * *W A R N I N G * * *
echo .
echo .The File(s)/Folders(s) Will Be Permanently Deleted!
echo .
echo .Press CTRL-C to Abort and Terminate Batch Job Or...
echo .
pause
sdelete -p 4 -s %1
pause

これを C:\sysinternals\shred.bat という名前で保存します。そしてこのバッチコマンドのショットカット(例:shred.bat – ショートカット)をデスクトップへ配置します。例えば、ごみ箱のとなり。。。

削除したいファイルをエクスプローラから「shred.bat – ショートカット」へドラッグ&ドロップします。
コマンドプロンプトが表示され何かキーを押すと消去が実行されます。中止するには CTRL + C キーを押下します。

shred1

ファイル名に日本語が含まれていると ???? で表示されてしまいますが、消去は実行されます。

shred2