无法在Firebase Realtime数据库中使用推送写入多个JSON记录

时间:2018-09-19 09:28:39

标签: python firebase firebase-realtime-database

我有一个大约3 GB的巨大JSON文件,其中包含多个JSON记录(每行每条记录),如下所示:

{"deviceId":"52b336d46d01bde9","dow":"Thursday","downloadFlag":"N"}
{"deviceId":"8B0FCD5F-B62A-5351-0000-000000000000","dow":"Thursday"}
{"deviceId":"969D8075-9C9B-DE14-0000-000000000000","dow":"jeudi","downloadFlag":"Y"}

我必须在Firebase Realtime DB中编写这些JSON记录,我正在尝试使用以下提到的代码通过Python实现它:

import firebase_admin
from firebase_admin import credentials

from firebase_admin import db
import json

cred = credentials.Certificate('./test.json')
app = firebase_admin.initialize_app(cred, {'databaseURL' : 'https://test.firebaseio.com/'})

user_activities_sample = db.reference("userActivities")

new_post_ref = user_activities_sample.push()

f = open("test_save.json", "r")

for line in f.readlines():
    data = json.loads(line)
    print data
    new_post_ref.set(data)

问题是,只有JSON文件中的最后一条记录才被写入数据库。 我的代码中有什么不正确的地方吗?或者我对push的理解是错误的?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您的代码实际上是在做什么,每次使用set()方法时,它都会覆盖这些值。

因为new_post_ref = user_activities_sample.push()这行代码在变量Database Reference中存储了一个new_post_ref(除非更改,否则它将保持不变),并且每次set() ref而无需更改。这就是firebase覆盖数据库中键new_post_ref上的值的原因,因此,这将仅保存最后set()个值。

因此,要纠正此行为,您每次在数据库中push()一个新值时都必须set(),例如:

import firebase_admin
from firebase_admin import credentials

from firebase_admin import db
import json

cred = credentials.Certificate('./test.json')
app = firebase_admin.initialize_app(cred, {'databaseURL' : 'https://test.firebaseio.com/'})

user_activities_sample = db.reference("userActivities")

f = open("test_save.json", "r")

for line in f.readlines():
    data = json.loads(line)
    print data
    user_activities_sample.push().set(data) # now there will be new ref everytime you add new value to database

这样,您的问题将被根除。