【コピペで完了】9割の機能を網羅!PytonからSQLiteを扱うクラスを作ってみました。

当ページのリンクには広告が含まれています。

PythonのSQLiteパッケージを使うと、メモリに乗り切らないデータを1件づつ読み込んで処理するような小回りの利く操作が可能です。

しかし、そもそもメモリに乗り切らない大量データに対しては、SQLで処理することがデータベースの強みですし、メモリに読み込む必要があるとしても、通常は抽出条件で一部のみを抽出するケースが大半です。

だったら、コネクトやクローズなど必ず付いて回る記述は省略するなどで、もっと簡単にSQLiteを使いたいと思いますよね。

ということで、以前C#でPython用の便利クラスを公開しましたが、今回はPython版を作ったので公開したいと思います。

単にSQLiteへのコネクトやクローズだけではなく、テーブルの存在チェック、テーブル作成、1つのトランザクション内での複数SQLの実行、テーブル一覧やカラム一覧など取得機能も用意していますので、是非参考にして頂ければと思います。

目次

クラスの使い方

今回は LocalCache というクラス名にしています。

使う際には、下記の通り sqlite3 のパッケージをインポートしておいて下さい。

リファレンス(メソッドの名前と仕様)

今回のクラスに実装されているメソッドの一覧と仕様は以下の通りです。

機能メソッド名と引数戻り値補足
コンストラクタLocalCache(filenameインスタンスデータベースファイルを指定してインスタンスを生成
任意のSQLを実行execute(sql)なし任意のSQLを1つだけ実行
複数のSQLをまとめて実行execute_all(sqls)なしリストに格納された複数のSQLをトランザクション付きで実行。
エラーが発生するとロールバックされる。
問い合わせSQLの実行execute_query(sql)リストselect等の問い合わせSQLを実行し、全ての結果をリストで返す。
例: [ (aa , 123 , True) , (bb , 567 , False) ]
1つの値を返すSQLの実行execute_scalor(sql)単一の値1個の値を返す問い合わせSQLを実行し、結果を取得
テーブルの作成create(
tablename,
columns,
primarykey = '',
isdrop=False
)
なしテーブル名、カラム名、主キーを指定してテーブルを作成する。
既にテーブルがあればエラーとなるが、
isdrop=Trueにすることで、既にテーブルが存在していれば削除を実行する。
テーブルの削除drop(tablename)なしテーブルが存在していれば削除する。
テーブルの存在チェックexists(tablename)True/Falseテーブルが存在していれば True、存在しなければ Falseを返す。
テーブル名の変更rename
(
old_tablename,
new_tablename
)
なしold_tablename を new_table_nameに変更する
カラムの追加add_column
(
tablename,
columns
)
なしtablenameで指定したテーブルにcolumnsで指定した列を追加する。
columnsはカラム名をカンマ区切りで羅列する。
カラム名の後に型を指定することも可能。
例:'col1 , col2 , col3 text , col4 real'
Create文の取得get_create_statment
(
tablename
)
strtablenameで指定したテーブルのCreate文を文字列で返す。
テーブル一覧の取得get_table_list
(
table_type=’’
)
リストデータベースに登録されているテーブル及びビューの名前をリストで返す。
例:[ 'table1' , 'table2' , 'table3' ]
カラムの名前と型の一覧を取得get_column_type(
tablename
)
リストtablenameで指定したテーブルにおいて、カラム名と型をタプルに格納し、リストで返す。
例:[ ('col1' , 'text') , ('col2' , 'real') ]
カラムの名前の一覧を取得get_column_list(
tablename
)
リストtablenameで指定したテーブルにおいて、カラム名をリストで返す。
例:[ 'col1' , 'col2' , 'col3' ]
データベースの空き領域を解放vacuum()なしDeleteやdorp で生じた未使用領域を解放し、データベースファイルの容量を小さくする。
現在のデータベース容量×2倍の空き容量が必要。

簡単な使い方のサンプル

test といテーブルを作成し、データの追加、検索、カラム追加など、一通りの処理を実行するサンプルです。

クラスのソースコード

以下が今回のクラスのソースコードです。

そのままコピー&ペーストで張り付けて利用できます。

あとは、自由に変更してお使いください。

一応、Pythonで推奨される命名規則とコメントの書き方を使っています。

補足説明

この章では、本クラスについての改良ポイント、課題について解説します。

もし再利用されるのであれば、この点についてご留意ください。

DB接続/クローズ処理の共通化

SQLは大きく2つのカテゴリに分けることが出来ます。

  • データベース又はデータの更新に関するもの(更新系)
  • データの参照に関するもの(参照系)

データベースへの接続(connect) 、カーソル(cursor)の取得、カーソルと接続のクローズ処理は全てに共通ですが、更新はコミットやロールバック処理が必要なのに対し、参照はフェッチ(結果の受信)が必要になるなど、微妙に違いがあります。

最初は、接続とクローズの共通化ということで、下記の様なメソッドを考えました。

しかし、プログラムが少々複雑になるため、第三者が修正しにくくなるのではないかと考えて断念しました。

__open や __close の様なものを用意するのであれば、基底クラスとして作成しておいて、これを継承するような書き方が望ましいのかもしれませんが、今回はそれも凝りすぎかと思って止めました。

カラム名の変更

多くのデータベースは、カラム名を変更するために alter table ~ rename column という命令をサポートしています。

しかし、残念ながらSQLiteではサポートされていません。

対策としては、元のテーブルのcreate文からカラム名を変更した新しいテーブルを作成し、元のテーブルの中身をコピーしてから元のテーブルを変えるという荒業を行わなければなりません。

問題となるのは旧テーブルのCreate文に対して、どのように新しいカラム名を反映させるかです。

一番安直な方法は、カラム名をreplaceすることですが、型も変更したいケースもあるでしょうし、他のカラム名と部分一致してしまう可能性も考えられます。

となると、空白やカンマでトークン分解(splitメソッド)を行い、末尾の primary key を対象外にするとともに、primary key 以降のカラム名は変更対象とする・・・という複雑な手順が必要です。

一般的にカラム名の変更はそれほど頻度が多くないので、今回は見送ることにしました。

まとめ

今回は Python でSQLiteを使う上で、あれば便利な機能を一通り網羅したヘルパークラスを作成したので、公開してみました。

テーブル一覧の取得やカラム一覧の取得、create文の取得など、個々に検索して入手しなければならない情報もまとめて掲載しています。

おそらくだいたいのことは出来ると思いますので、後は皆さんの利用方法に合わせて拡張して頂ければと思います。

C#について同じようなクラスを作成していますので、興味のある方はこちらも参照して頂ければと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次