repl 特化 pythonでデータベースの探検をするのに快適 db.py
replでの作業に特化した db.py を発見した。データベースの中身を探検するのに快適である。
ほとんど知名度がないらしいので紹介する。
"repl"そのものの説明については、テキトーに検索してほしい。
利用例
例えば redmine のsqliteデータベースを探検する場合を示す。
import db
内部で多数の別ライブラリをインポートしてるため、例えば macbook air 2015 でも0.3秒程度の待ちがある。
z = db.DB(filename="redmine.db",dbtype="sqlite")
ここで、z.tables を出力させると.....
z.tables
なんとテーブル一覧が出てくる。話早すぎない?
+--------+-------------------------------------+----------------------------------------------------------------------------------+
| Schema | Table | Columns |
+--------+-------------------------------------+----------------------------------------------------------------------------------+
| public | ar_internal_metadata | key, value, created_at, updated_at |
| public | attachments | id, container_id, container_type, filename, disk_filename, filesize, content_typ |
テーブルについては、pythonの多段オブジェクトをレミュレーションしてるため、attachment テーブルの構造も簡単に確認できる。
z.tables.attachments
+--------------------------------------------------------------+
| attachments |
+----------------+-------------+--------------+----------------+
| Column | Type | Foreign Keys | Reference Keys |
+----------------+-------------+--------------+----------------+
| id | INTEGER | | |
| container_id | INTEGER | | |
| container_type | varchar(30) | | |
| filename | varchar | | |
| disk_filename | varchar | | |
| filesize | integer(8) | | |
| content_type | varchar | | |
| digest | varchar(64) | | |
| downloads | INTEGER | | |
| author_id | INTEGER | | |
| created_on | datetime | | |
| description | varchar | | |
| disk_directory | varchar | | |
+----------------+-------------+--------------+----------------+
ここまで来たならデータの中身も見たいだろう。簡単である。
z.tables.attachments.all()
id container_id container_type ... created_on description disk_directory
0 2 8 Issue ... 2022-12-06 08:49:14.451102 2022/12
1 4 3 WikiPage ... 2022-12-12 20:05:22.513847 2022/12
2 5 3 WikiPage ... 2022-12-12 20:05:26.857349 2022/12
3 6 3 WikiPage ... 2022-12-12 20:05:31.266320 2022/12
4 7 7 Issue ... 2022-12-15 07:06:38.157192 2022/12
.. ... ... ... ... ... ... ...
99 108 55 Issue ... 2023-02-02 01:12:31.270486 2022/12
100 109 56 Issue ... 2023-02-02 02:43:07.191136 2023/02
101 110 56 Issue ... 2023-02-02 02:43:07.103318 2023/02
102 111 56 Issue ... 2023-02-02 02:43:07.768887 2023/02
103 112 55 Issue ... 2023-02-02 02:56:29.016437 2023/02
all() の返り値は、pandas.core.frame.DataFrameを使ってるようだ。配列スライスは効かなかったが、個々のデータを取り出すことは可能だと思われる。
もちろん db.py の機能はこれだけではない。詳しくはドキュメントを参照されたし。
replで使えるということはjupyter notebookでも動くということでもある。
その場合は import dbやらdb.DB()やらで、ちょっと待たされることがあるので注意されたし。
Discussion