個人開発をしていて、データベース設計を行なっていたときに、都道府県や市区町村データを予めDBに突っ込んでおきたいなあという場面があった。
Railsだと、初期データを予め突っ込んでおくseedという機能がデフォルトで用意されている。
しかし、Flaskにはいろいろ調べたのですがなかなか良さげなものが見つからず。なんでや!
ということで、すでに作成したDBに対して初期データを突っ込んでおくシェルスクリプトを書きました。
import_data.sh
db_file="instance/sharejog.sqlite"
pref_csv_file="flask_app/data/prefectures.csv"
pref_table_name="data_models_prefectures"
city_csv_file="flask_app/data/cities.csv"
city_table_name="data_models_cities"
facility_csv_file="flask_app/data/facilities.csv"
facility_table_name="data_models_facilities"
sqlite3 $db_file <<EOF
.mode csv
.import $pref_csv_file $pref_table_name
.import $city_csv_file $city_table_name
.import $facility_csv_file $facility_table_name
.quit
EOF
気をつけなくてはならないこととして、当然ではありますが、csvの構成とDBのスキーマ構成との間にきちんと整合性をとる必要がある。(そうしないときちんと格納できないよね)
テーブル作成まで完了したら、Flaskアプリケーションを起動する前にこれを実行すれば良い。具体的には、
flask db init && flask db migrate && flask db upgrade && chmod +x import_data.sh && ./import_data.sh && gunicorn -b 0.0.0.0:$PORT flask_app.app:app
をRender.comのStart Commandに設定すればOK。