概要
以下のことは済ませているものと考えてください。契約状態によって確認事項が違いますので、簡単に。
- Firestoreを有効化
- APIキーの発行(firebaseにて出来ます)
- firebaseはnativeモード
データ構造
csvファイル体裁
区切りは「,」としています。たまに規則通りになっていないcsvファイルがあったりするので、その辺りは気を付けてください。
DB構成
今回は簡単な構成です。uniqueというところを主キーのように考えており、重複なしです。
DB構成
unique ---------- item1
| | a : 1
| | b : 2
| ∟ c : 3
|
|--------- item1
| | a : 4
| | b : 5
| ∟ c : 6
|
∟ --------- item1
| a : 7
| b : 8
∟ c : 9
プログラム
以下のようなことをやっています。
- データ読込み
- firestore変数初期化
- 一つずつfirestoreに登録
sample.py
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import csv
# データ読込み
def read_data(file_name):
csv_data = None
with open(file_name) as r:
reader =csv.reader(r)
csv_data = [row for row in reader]# 二次元配列で変数に格納
print('read end')
return csv_data
# firebase 初期化処理
def firebase_init(api_key):
api_key = credentials.Certificate(api_key)
# 前回の初期化状態が残っているみたいなので、まずは前回の初期化状態を削除
if(len(firebase_admin._apps)):
firebase_admin.delete_app(firebase_admin.get_app())
firebase_admin.initialize_app(api_key)
print("init end")
# メイン処理/データ登録
def exe(data):
db = firestore.client()# firestoreクライアント変数
header = data[0]# ヘッダ取得
doc_base = db.collection(header[0])# uniqueの所を設定
print("proc start")
for i in range(1, len(data)):# 2行目からがデータなので、1から
doc_ref = doc_base.document(data[i][0])# a,b,cのところを設定
buf = {}# バッファ
for j in range(1, len(data[i])):
buf[header[j]] = data[i][j]
doc_ref.set(buf) # firestoreに保存
print("poc end")
def main():
file_name = "csvファイル名"
api_key = r'api_key'
# ファイル読込み
data = read_data(file_name)
# firebase初期化
firebase_init(api_key)
# メイン処理
exe(data)
if __name__=="__main__":
main()
おわりに
今回まっさらな状態での一括登録ですが、途中でfirestoreからデータを一括取得し、差分チェックしてfirestoreに更新するというようにすると良いとは思います。api呼び出し回数が減るので、料金が減るんですかね。試算はしていませんが。