LoginSignup
0
2

More than 3 years have passed since last update.

Pythonにてcsvファイルを用いてFirestoreにデータを一括登録する

Last updated at Posted at 2020-02-12

概要

以下のことは済ませているものと考えてください。契約状態によって確認事項が違いますので、簡単に。

  • Firestoreを有効化
  • APIキーの発行(firebaseにて出来ます)
  • firebaseはnativeモード

データ構造

csvファイル体裁

区切りは「,」としています。たまに規則通りになっていないcsvファイルがあったりするので、その辺りは気を付けてください。

testimage.jpg

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呼び出し回数が減るので、料金が減るんですかね。試算はしていませんが。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2