Ошибка записи в облачный гаечный ключ Google с использованием облачных функций Google - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь вставить данные в таблицу облачных ключей, используя облачные функции, но выдает ошибку, приведенную ниже. Считывание данных из облачного ключа работает правильно, но запись выполняется с помощью команд языка определения данных и метода batch.insert, оба выдают та же ошибка. Я думаю, это какая-то проблема с разрешениями! Я не знаю, как это исправить?

Файл требований содержит только google-cloud-spanner == 1.7.1

Код работает в облачных функциях

import json
from google.cloud import spanner
INSTANCE_ID = 'AARISTA'
DATABASE_ID = 'main'
TABLE_NAME = 'userinfo'
dataDict = None

def new_user(request):
    dataDict = json.loads(request.data)# Data is available in dict format
    if dataDict['USER_ID']==None:
       return "User id empty"
    elif dataDict['IMEI'] == None:
       return "Imei number empty"
    elif dataDict['DEVICE_ID'] == None:
       return "Device ID empty"
    elif dataDict['NAME'] == None:
       return "Name field is empty"
    elif dataDict['VIRTUAL_PRIVATE_KEY']== None:
       return "User's private key cant be empty"  
    else:
       return insert_data(INSTANCE_ID,DATABASE_ID)

def insert_data(instance_id, database_id):
      spanner_client = spanner.Client()
      instance = spanner_client.instance(instance_id)
      database = instance.database(database_id)
      def insert_user(transcation):
          row_ct= transcation.execute_update("INSERT userinfo 
                   (USER_ID,DEVICE_ID,IMEI,NAME,VIRTUAL_PRIVATE_KEY) VALUES"
                                   "("+dataDict['USER_ID']+', 
                 '+dataDict['DEVICE_ID']+', '+ dataDict['IMEI']+', 
                 '+dataDict['NAME']+', 
             '+dataDict['VIRTUAL_PRIVATE_KEY']+")")

      database.run_in_transaction(insert_user)
      return 'Inserted data.'

Журналы ошибок в облачных функциях

Traceback (most recent call last): 
  File "/env/local/lib/python3.7/site-packages/google/cloud/spanner_v1/pool.py", line 265, in get session = self._sessions.get_nowait() 
  File "/opt/python3.7/lib/python3.7/queue.py", line 198, in get_nowait return self.get(block=False)
  File "/opt/python3.7/lib/python3.7/queue.py", line 167, in get raise Empty _queue.Empty
During handling of the above exception, another exception occurred:
Traceback (most recent call last): 
  File "/env/local/lib/python3.7/site-packages/google/api_core/grpc_helpers.py", line 57, in error_remapped_callable return callable_(*args, **kwargs)
  File "/env/local/lib/python3.7/site-packages/grpc/_channel.py", line 547, in __call__ return _end_unary_response_blocking(state, call, False, None) 
  File "/env/local/lib/python3.7/site-packages/grpc/_channel.py", line 466, in _end_unary_response_blocking raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that  terminated with: status = StatusCode.INVALID_ARGUMENT details =  "Invalid CreateSession request." debug_error_string = "{"created":"@1547373361.398535906","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1036,"grpc_message":"Invalid> CreateSession request.","grpc_status":3}" > 
The above exception was the direct cause of the following exception: 
Traceback (most recent call last): 
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 297, in run_http_function result = _function_handler.invoke_user_function(flask.request) 
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 199, in invoke_user_function return call_user_function(request_or_event) 
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 192, in call_user_function return self._user_function(request_or_event) 
  File "/user_code/main.py", line 21, in new_user return insert_data(INSTANCE_ID,DATABASE_ID) 
  File "/user_code/main.py", line 31, in insert_data database.run_in_transaction(insert_user) 
  File "/env/local/lib/python3.7/site-packages/google/cloud/spanner_v1/database.py", line 438, in run_in_transaction with SessionCheckout(self._pool) as session:
  File "/env/local/lib/python3.7/site-packages/google/cloud/spanner_v1/pool.py", line 519, in __enter__ self._session = self._pool.get(**self._kwargs)
  File "/env/local/lib/python3.7/site-packages/google/cloud/spanner_v1/pool.py", line 268, in get session.create()
  File "/env/local/lib/python3.7/site-packages/google/cloud/spanner_v1/session.py", line 116, in create session_pb = api.create_session(self._database.name, metadata=metadata, **kw)
  File "/env/local/lib/python3.7/site-packages/google/cloud/spanner_v1/gapic/spanner_client.py", line 276, in create_session request, retry=retry, timeout=timeout, metadata=metadata
  File "/env/local/lib/python3.7/site-packages/google/api_core/gapic_v1/method.py", line 143, in __call__ return wrapped_func(*args, **kwargs) 
  File "/env/local/lib/python3.7/site-packages/google/api_core/retry.py", line 270, in retry_wrapped_func on_error=on_error, 
  File "/env/local/lib/python3.7/site-packages/google/api_core/retry.py", line 179, in retry_target return target()
  File "/env/local/lib/python3.7/site-packages/google/api_core/timeout.py", line 214, in func_with_timeout return func(*args, **kwargs)
  File "/env/local/lib/python3.7/site-packages/google/api_core/grpc_helpers.py", line 59, in error_remapped_callable six.raise_from(exceptions.from_grpc_error(exc), exc) 
  File "<string>", line 3, in raise_from
google.api_core.exceptions.InvalidArgument: 400 Invalid CreateSession request.

1 Ответ

0 голосов
/ 15 января 2019

Я пытался воспроизвести это, но мне кажется, что это работает как функция Python 3.7. Я использовал новейшую библиотеку google-cloud-spanner в файле require.txt.

Хотя я не уверен, что может послужить причиной вашей ошибки, я заметил еще несколько вещей.

  • Казалось странным объявить глобальный dataDict, а не использовать созданный и передавать его. Вместо этого я добавил это как параметр в метод вставки.
  • Интервал запроса был немного странным, а использование одинарных и двойных кавычек было странным. это затрудняло визуальный анализ. Поскольку функция работает как python 3.7, вы также можете использовать f-строки, которые, вероятно, сделают ее еще более читабельной.

Вот код, который я запустил в функции, которая, казалось, работала.

import json
from google.cloud import spanner
INSTANCE_ID = 'testinstance'
DATABASE_ID = 'testdatabase'
TABLE_ID = 'userinfo'

def new_user(request):
    data = { 'USER_ID': '10', 'DEVICE_ID': '11' }  
    return insert_data(INSTANCE_ID, DATABASE_ID, data)

def insert_data(instance_id, database_id, data):
    spanner_client = spanner.Client()
    instance = spanner_client.instance(instance_id)
    database = instance.database(database_id)

    def insert_user(transaction):
        query = f"INSERT {TABLE_ID} (USER_ID,DEVICE_ID) VALUES ({data['USER_ID']},{data['DEVICE_ID']})"
        row_ct = transaction.execute_update(query)

    database.run_in_transaction(insert_user)
    return 'Inserted data.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...