开始获取错误:“元素中的非字母字符带有前导Alpha:”尝试更新文档时出错

时间:2018-12-27 02:59:06

标签: python google-cloud-firestore

我已经用这种方式做了一段时间了。

在过去两个月中,一切正常,并且无处不出现此错误,“尝试在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   

我希望输出能够成功更新,但似乎会引发错误。

2 个答案:

答案 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,
})