我已经用这种方式做了一段时间了。
在过去两个月中,一切正常,并且无处不出现此错误,“尝试在Firestore上进行更新时,'非字母数字char出现在前导alpha中:'。我什至不知道从哪里开始寻找问题。
# returns true if update was successful
def UpdateUser(self, user):
try:
# update will fail if it cant find an already existing document
doc_ref = self._db.collection(USER).document(user._username)
# update the values | this will fail if it doesn't exist
doc_ref.update({
u'Username': user._username,
u'Password': user._password,
# u'Time Created': user._time_created,
u'Last logged in': user._last_logged_in,
u'Active': user._active,
u'Phone': user._phone,
u'Address': user._address,
u'State': user._state,
u'City': user._city,
u'Zipcode': user._zipcode,
u'Stripe Customer Id': user._stripe_customer_id,
u'Email Activated': user._email_activated,
u'Full Name': user._full_name,
u'Id': user._id,
u'Group Ids': user._group_ids,
})
return True
except Exception as e:
print(e)
print("Failed to update {}".format(user._username))
return False
我希望输出能够成功更新,但似乎会引发错误。
答案 0 :(得分:0)
我正在努力解决相同的错误。每当我运行下面显示的代码时,我通常都会收到此错误:
db.collection(''+collectionName).document(''+docId).update({'api-key':newkey})
它抛出此错误,因为键本身中有非字母数字字符。因此,我不得不在firebase中更改密钥,并在代码中将其更改为此:
db.collection(''+collectionName).document(''+docId).update({'apikey':newkey})
以您为例,删除键的所有空格(在firebase中执行相同操作),然后尝试以下操作:
doc_ref.update({
u'Username': user._username,
u'Password': user._password,
u'TimeCreated': user._time_created,
u'Lastloggedin': user._last_logged_in,
u'Active': user._active,
u'Phone': user._phone,
u'Address': user._address,
u'State': user._state,
u'City': user._city,
u'Zipcode': user._zipcode,
u'StripeCustomerId': user._stripe_customer_id,
u'EmailActivated': user._email_activated,
u'FullName': user._full_name,
u'Id': user._id,
u'GroupIds': user._group_ids,
})
答案 1 :(得分:0)
根据此answer,您需要在包含非字母,数字或下划线的字符的任何字符串上使用field_path()。 在您的情况下,您的密钥中有空格,因此您应该使用field_path对其进行清理。 这段代码可以解决您的问题:
doc_ref.update({
u'Username': user._username,
u'Password': user._password,
# self._db.field_path(u'Time Created'): user._time_created,
self._db.field_path(u'Last logged in'): user._last_logged_in,
u'Active': user._active,
u'Phone': user._phone,
u'Address': user._address,
u'State': user._state,
u'City': user._city,
u'Zipcode': user._zipcode,
self._db.field_path(u'Stripe Customer Id'): user._stripe_customer_id,
self._db.field_path(u'Email Activated'): user._email_activated,
self._db.field_path(u'Full Name'): user._full_name,
u'Id': user._id,
self._db.field_path(u'Group Ids'): user._group_ids,
})