kuroの覚え書き

96の個人的覚え書き

Flaskアプリでデータベースのテーブルを消したり作ったり

テーブルのclassを設計して起動時にテーブルを作成する事はできていたが、内部で操作をしてすでにあるテーブルを消して作り直すと言うのはやってなかった。
https://stackoverflow.com/questions/35918605/how-to-delete-a-table-in-sqlalchemy
結論としては簡単で

テーブルクラス名.__table__.drop(engine)
テーブルクラス名.__table__.create(engine)

これで一旦消して、作り直せた。

こうして空っぽになったテーブルに他のテーブルからカラムの一部分を切り出してきてinsertするには
http://docs.sqlalchemy.org/en/latest/changelog/migration_09.html#insert-from-select
ここに書かれているようにするわけだが、

db_uri = 'sqlite:///db.sqlite'
engine = create_engine(db_uri)

s = Session()
q = s.query(User.id, User.name).filter_by(name='ed')
ins = insert(Address).from_select((Address.id, Address.email_address), q)

conn = engine.connect()
conn.execute(ins)

これだけでセットにして入ってないといけない。
テーブルを生成する際に最初の2行は必要なので、すでに入っているはずなので
insを指定した後conn以降の処理が必要なわけだ。最初これが抜けていてちっともinsertできなくて悩んだ。気がつけば当たり前なんだけど、SQLAlchemyの説明ってこういう当たり前のところをさらっと省略しちゃってて素人に優しくない。

さて、どうにか整形ができるようになったところでデータのメンテナンスについてちょっと考える。
どんどん増えていくデータをまずはすべてのカラムを保持したデータベース上にインポートする。つまり全カラムを持ったデータベースはどんどんと行を増やしていくだけ。
実際に検索に使うカラムは1割にも満たないので、使うカラムだけに絞ったサブセットを作る。できたサブセットにはハッシュや追加情報を入力して運用する。
データの追加インポートによって増えた分については、増加したぶんだけサブセットを抽出して、これまでのサブセットに追加する。追加によってこれまでに入力したハッシュ等情報は維持され、追加分だけ情報をまた継ぎ足していく。ただし、全体から計算されるカウントについてはデータ追加の都度計算し直して、更新をかける。

こんな感じで行こう。
そのためのすべてのカラムを持ったデータベースの作成、差分のサブセットを抽出するアプリを作っておく。