
概要
ローカルホスト(python-bottle)を使ったDBのソフトウェアを作っています。
データベースはsqliteを使用しています。
sqliteファイルは事情により複数に分かれていますので(これは前提でお願いします)、それを仮想的に結合させて1個のDBのように扱っています。
あまり経験がなく悩んだのですが、あれこれ考えた末、inmemoryの機能を使って、ひとまず各ファイルのテーブルを寄せ集めてくることにしました。
簡略化したサンプルを示します。
python
1 conn=sqlite3.connect(":memory:") 2 conn.row_factory = sqlite3.Row 3 c=conn.cursor() 4 5 sql="create table datas (id integer,data text,created_at text)" 6 c.execute(sql) 7 8 #複数dbからデータを集めてくる 9 paths=[dbパスのリスト] 10 11 for path in paths: 12 with closing(sqlite3.connect(path)) as conn2: 13 conn2.row_factory = sqlite3.Row 14 c2=conn2.cursor() 15 ~SELECTしてデータを寄せ集め、paraを作る~ 16 17 #インメモリDBにインサートする 18 sql_insert = "insert into datas values(?)" 19 c.executemany(sql_insert1,para) 20
起動時に読み込み
最初は以上の寄せ集めプロセスを毎回実行していたのですが、途中で「inmemoryはサーバー起動中ずっと維持できるのでは?」と思ったため、@routeよりも前に書いてみたところ、それでも一応正常に動いています。
現状では以下のようなコードになっています。
class MakeMemoryDB(): def __init__(self,paths): conn=sqlite3.connect(":memory:") conn.row_factory = sqlite3.Row c=conn.cursor() sql="create table datas (id integer,data text,created_at text)" c.execute(sql) #複数dbからデータを集めてくる paths=[dbパスのリスト] for path in paths: with closing(sqlite3.connect(path)) as conn2: conn2.row_factory = sqlite3.Row c2=conn2.cursor() ~SELECTしてデータを寄せ集め、paraを作る~ #インメモリDBにインサートする sql_insert = "insert into datas values(?)" c.executemany(sql_insert1,para) self.conn=conn M=MakeMemoryDB(dbpath) @route('/hello') def hello(): conn=M.conn c=conn.cursor() ~select実行~ return data #ここでインメモリDBは閉じずに維持される模様(現状では大丈夫だが不安)
質問
今のところ正常に動作しているように見えます。また、速度もテストしてみたところ、クエリの実行時間も、ディスクから実行するときのおよそ半分ほどで済みました。
ただ、こういう使い方を聞いたことがないのと、以前こちらで質問させてもらった際に、こういう用法はなかったように思います。
https://teratail.com/questions/121729
果たしてこれで問題が無いのか不安があります。そこで質問なのですが、
1 以上の方式で何か問題が起きてくる可能性はないでしょうか(思わぬところで正常に動作しない、DBが閉じてしまうなど)
2 classを作って、connを作る方法をとっていますが、DB接続としてこのやり方に問題はないでしょうか。
3 その他気をつける点や改良すべき点はないでしょうか。
独学で経験も少ないため、判断が難しいです。
ご指導よろしくお願いいたします。
追記
データベースファイルが複数あることが不合理に見える思いますが、背景があり、諸々検討の上での既定事項ですので、その点は前提にしていただけるようお願いいたします。質問者の主関心はインメモリの動作具合にあります。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/05/04 03:51
2018/05/04 04:10
退会済みユーザー
2018/05/04 04:17
2018/05/04 04:23
退会済みユーザー
2018/05/07 07:33