AttributeError: _nano Second при обновлении даты и времени в транзакцииPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 AttributeError: _nano Second при обновлении даты и времени в транзакции

Сообщение Anonymous »

Поэтому я пытаюсь обновить поле даты и времени в облачном хранилище Firestore с помощью облачной функции следующим образом:

Код: Выделить всё

transaction.update(doc_ref, {'dateTimeField1': dateTimeValue})
Google отправляет объекты datetime в виде строки в параметре события облачной функции в формате %Y-%m-%dT%H:%M:%SZ или %Y-%m-%dT%H:%M:%S.%fZ.

Например: 2019-01-25T15:25:03.881Z

Я конвертирую его в объект datetime следующим образом:

Код: Выделить всё

try:
datetime_obj = datetime.datetime.strptime(datetime_obj, '%Y-%m-%dT%H:%M:%S.%fZ')
except:
datetime_obj = datetime.datetime.strptime(datetime_obj, '%Y-%m-%dT%H:%M:%SZ')
datetime_obj = datetime_obj.replace(tzinfo=timezone('UTC'))
Но когда я пытаюсь выполнить операцию, меня встречает следующая ошибка:

Код: Выделить всё

AttributeError: _nanosecond
Обратная связь:

Код: Выделить всё

File "/env/local/lib/python3.7/site-packages/google/cloud/firestore_v1beta1/batch.py", line 112, in update
reference._document_path, field_updates, option
File "/env/local/lib/python3.7/site-packages/google/cloud/firestore_v1beta1/_helpers.py", line 822, in pbs_for_update
update_pb = extractor.get_update_pb(document_path)
File "/env/local/lib/python3.7/site-packages/google/cloud/firestore_v1beta1/_helpers.py", line 459, in get_update_pb
name=document_path, fields=encode_dict(self.set_fields)
File "/env/local/lib/python3.7/site-packages/google/cloud/firestore_v1beta1/_helpers.py", line 215, in encode_dict
return {key: encode_value(value) for key, value in six.iteritems(values_dict)}
File "/env/local/lib/python3.7/site-packages/google/cloud/firestore_v1beta1/_helpers.py", line 215, in 
return {key: encode_value(value) for key, value in six.iteritems(values_dict)}
File "/env/local/lib/python3.7/site-packages/google/cloud/firestore_v1beta1/_helpers.py", line 169, in encode_value
return document_pb2.Value(timestamp_value=value.timestamp_pb())
File "/env/local/lib/python3.7/site-packages/google/api_core/datetime_helpers.py", line 278, in timestamp_pb
nanos = self._nanosecond or self.microsecond * 1000
AttributeError: _nanosecond
Разрешено ли устанавливать дату и время посредством транзакций или я что-то здесь упускаю?

< strong>РЕДАКТИРОВАТЬ:

фрагмент кода:

Код: Выделить всё

@firestore.transactional
def update_datetime_field(transaction, doc_ref, datetime_value):
try:
datetime_obj = datetime.datetime.strptime(datetime_value, '%Y-%m-%dT%H:%M:%S.%fZ')
except:
datetime_obj = datetime.datetime.strptime(datetime_value, '%Y-%m-%dT%H:%M:%SZ')
datetime_obj = datetime_obj.replace(tzinfo=timezone('UTC'))
# Example of datetime_obj -> datetime.datetime(2019, 1, 25, 15, 25, 3, 881000, tzinfo=)
transaction.update(doc_ref, {'datetimeField1': datetime_obj})
return True
Дополнительная информация:
  • Приведенный выше код срабатывает при обновлении документа. скажем

    Код: Выделить всё

    collection1/document1/collection2/document2
  • Объект datetime — это дата и время Python из стандартной библиотеки.
  • Я пытаюсь преобразовать дату в формат UTC, изменив часовой пояс с помощью pytz.
РЕДАКТИРОВАНИЕ 2:

Лучше Полная картина:

Код: Выделить всё

from firebase_admin import credentials, firestore

# initialize firebase admin sdk
creds = credentials.ApplicationDefault()
firebase_admin.initialize_app(creds,{'projectId': 'myProjectId'})

@firestore.transactional
def update_datetime_field(transaction, doc_ref, datetime_value):
try:
datetime_obj = datetime.datetime.strptime(datetime_value, '%Y-%m-%dT%H:%M:%S.%fZ')
except:
datetime_obj = datetime.datetime.strptime(datetime_value, '%Y-%m-%dT%H:%M:%SZ')
datetime_obj = datetime_obj.replace(tzinfo=timezone('UTC'))
# Example of datetime_obj -> datetime.datetime(2019, 1, 25, 15, 25, 3, 881000, tzinfo=)
transaction.update(doc_ref, {'datetimeField1': datetime_obj})
return True

def update_datetime_in_transaction(event, context):
datetime_value = event['value']['fields']['datetimeField1']['timestampValue']
# this looks something like 2019-01-25T15:25:03.881Z

# prepare document reference to document
doc_ref = prepare_doc_ref(event, context)

# update_datetime_field
client = firestore.client()
transaction = client.transaction()
update_datetime_field(transaction, doc_ref, datetime_value)

return True
РЕДАКТИРОВАНИЕ 3:

Снимок экрана с параметром события:
< img alt="введите здесь описание изображения" src="https://i.sstatic.net/ynXHE.png" />

Снимок экрана консоли:

Изображение


Подробнее здесь: https://stackoverflow.com/questions/543 ... ransaction
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»