Pensez-y comme ayant fait ce qui suit: Les éléments à vérifier varient en fonction de l'état du contrat, c'est donc facile.
Le délimiteur est ",". Parfois, il y a des fichiers csv qui ne suivent pas les règles, alors soyez prudent à ce sujet.

Cette fois, c'est une configuration simple. Je considère unique comme clé primaire et il n'y a pas de duplication.
Configuration de la base de données
unique ---------- item1 
       |           | a : 1
       |           | b : 2
       |            ∟ c : 3
       |
       |--------- item1 
       |           | a : 4
       |           | b : 5
       |            ∟ c : 6
       |
       ∟ --------- item1 
                   | a : 7
                   | b : 8
                    ∟ c : 9
Je fais ce qui suit.
--Lecture des données --firestore initialisation de la variable --Inscrivez-vous un par un dans le firestore
sample.py
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import csv 
#Lecture des données
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]#Stocké dans une variable sous forme de tableau à deux dimensions
    print('read end')
    
    return csv_data
#processus d'initialisation de Firebase
def firebase_init(api_key):
    api_key = credentials.Certificate(api_key)
    #Il semble que l'état d'initialisation précédent reste, supprimez donc d'abord l'état d'initialisation précédent
    if(len(firebase_admin._apps)):
        firebase_admin.delete_app(firebase_admin.get_app())
    firebase_admin.initialize_app(api_key)
    print("init end")
#Traitement principal / enregistrement des données
def exe(data):
    db = firestore.client()#variable client Firestore
    header = data[0]#Obtenir l'en-tête
    doc_base = db.collection(header[0])#Définir un lieu unique
    print("proc start")
    for i in range(1, len(data)):#Puisque les données proviennent de la deuxième ligne, de 1
        doc_ref = doc_base.document(data[i][0])# a,b,Situé à c
        buf = {}#tampon
        for j in range(1, len(data[i])):
            buf[header[j]] = data[i][j]
        doc_ref.set(buf) #Enregistrer dans Firestore
    print("poc end")
def main():
    file_name = "nom de fichier csv"
    api_key = r'api_key'
    #Lire le fichier
    data = read_data(file_name)
    #initialisation Firebase
    firebase_init(api_key)
    #Traitement principal
    exe(data)
if __name__=="__main__":
    main()
Cette fois, il s'agit d'un enregistrement par lots dans un état propre, mais je pense qu'il est préférable d'acquérir collectivement les données du firestore en cours de route, de vérifier la différence et de mettre à jour le firestore. Puisque le nombre d'appels API est réduit, la charge n'est-elle pas réduite? Je n'ai pas fait de calcul d'essai.
Recommended Posts