簡體   English   中英

雲扳手python客戶端刪除失敗,類型為INT64

[英]cloud spanner python client delete failed with INT64 type

我試圖在具有INT64類型鍵的表上傳遞刪除請求,並且收到以下錯誤:表INT_KEYS中列key1的值無效:預期為INT64

請求刪除操作時,有沒有鍵入鍵范圍的特定方法? 我可以使用相同的輸入插入數據,但是刪除請求失敗。 我寫了下面的短代碼來說明

keys = ['key1', 'key2']
ins_values = [[2, 5],
              [3, 6],
              [4, 7]]
del_values = [[2, 5],
              [4, 7]]

for table_name in ['STR_KEYS', 'INT_KEYS']:
    with database.batch() as batch:
        result = batch.insert_or_update(
            table_name, keys, ins_values
        )
    print 'completed insert in table %s' % table_name

    with database.batch() as batch:
        key_ranges = list()
        for value_list in del_values:
            key_range = spanner.KeyRange(start_closed=value_list, end_closed=value_list)
            key_ranges.append(key_range)
        key_set = spanner.KeySet(keys=[keys], ranges=key_ranges)
        result = batch.delete(
            table_name, key_set
        )
    print 'deleted data from table %s' % table_name

我得到下面的輸出

completed insert in table STR_KEYS
deleted data from table STR_KEYS
completed insert in table INT_KEYS
Traceback (most recent call last):
File "/Users/thibault/PycharmProjects/spanner-local/testIntDelete.py", line 89, in <module>
table_name, key_set
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/cloud/spanner_v1/database.py", line 409, in __exit__
self._batch.commit()
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/cloud/spanner_v1/batch.py", line 156, in commit
options=options)
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/cloud/spanner_v1/gapic/spanner_client.py", line 845, in commit
return self._commit(request, options)
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/gax/api_callable.py", line 452, in inner
return api_caller(api_call, this_settings, request)
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/gax/api_callable.py", line 438, in base_caller
return api_call(*args)
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/gax/api_callable.py", line 376, in inner
return a_func(*args, **kwargs)
File "/usr/local/Cellar/python/2.7.14/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/google/gax/retry.py", line 127, in inner
' classified as transient', exception)
google.gax.errors.RetryError: RetryError(Exception occurred in retry method that was not classified as transient, caused by <_Rendezvous of RPC that terminated with (StatusCode.FAILED_PRECONDITION, Invalid value for column key1 in table INT_KEYS: Expected INT64.)>)

使用delete API,您只需要在“鍵”或“范圍”中指定主鍵值,而無需指定值。 我推斷您的INT_KEYS模式類似於:

CREATE TABLE INT_KEYS(key1 INT64 NOT NULL,key2 INT64 NOT NULL,)主鍵(key1,key2);

在這種情況下,要刪除插入的行,您需要以下內容:

with database.batch() as batch:
    key_ranges = list()
    for value_list in del_values:
        key_range = spanner.KeyRange(start_closed=value_list, end_closed=value_list)
        key_ranges.append(key_range)
    key_set = spanner.KeySet(ranges=key_ranges)
    result = batch.delete(
        table_name, key_set
    )

注意,您不需要(也不應該嘗試)通過“ keys”屬性指定列名; 用於指定要刪除的特定行。

FWIW,您的代碼適用於STR_KEYS,因為(“” key1“,” key2“)可以成功地解釋為不存在的行的主鍵(key1 = key1,key2 = key2),並且Spanner不會報告錯誤刪除不存在的行時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM