python - 使用 Google 云函数写入 Google 云 Spanner 时出错

标签 python python-3.x google-cloud-platform google-cloud-functions google-cloud-spanner

我正在尝试使用云函数将数据插入到云 Spanner 表中,但它抛出了下面给出的错误。从云 Spanner 读取数据工作正常,但使用数据定义语言命令和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.'

Cloud Functions 上的错误日志

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.

最佳答案

我尝试重现这个,但它似乎作为 Python 3.7 函数对我有用。我在requirements.txt中使用了最新的google-cloud-spanner库。

虽然我不确定是什么导致了您的错误,但我确实注意到了其他一些事情。

  • 声明一个全局 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.'

关于python - 使用 Google 云函数写入 Google 云 Spanner 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167947/

相关文章:

python - 在 GAE 中组合文本搜索和查询过滤器

python-3.x - 为什么 OpenCV 不显示存储在 numpy 数组中的图像? (Python)

debian - 在 GCE Micro (Debian) 实例上安装 google-cloud-sdk

java - 应用程序默认凭据无法创建 Google App Engine 服务帐户凭据

python - 如何使用 Python 访问 Firefox 的内部 indexedDB 文件?

python - 如何在曲面图上绘制等高线? (4D)

python - Pandas,获取数据框列中单个值的计数

python - 无需提取即可获取 MySQL 游标行数

python - Python3的open()函数的时间复杂度是多少?

python - 使用 Django 在 Google App Engine 上永久将 http 重定向到 https