😊

repl 特化 pythonでデータベースの探検をするのに快適 db.py

2023/02/06に公開

replでの作業に特化した db.py を発見した。データベースの中身を探検するのに快適である。
ほとんど知名度がないらしいので紹介する。

https://pypi.org/project/db.py/

https://github.com/yhat/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 の機能はこれだけではない。詳しくはドキュメントを参照されたし。

https://github.com/yhat/db.py/blob/master/README.md

replで使えるということはjupyter notebookでも動くということでもある。
その場合は import dbやらdb.DB()やらで、ちょっと待たされることがあるので注意されたし。

Discussion