使用python从表存储中检索超过1000行

时间:2017-02-01 15:03:07

标签: python azure-storage

我在此论坛中使用以下模式从表存储中提取数据:

next_pk=0
next_rk=0
while True:
    xa=table_service.query_entities(table_name=tableName, filter=dataFilter, num_results=1000, next_partition_key = next_pk, next_row_key = next_rk )
    i+=1
    if hasattr(accelxa, 'x_ms_continuation'):
        x_ms_continuation = getattr(accelxa, 'x_ms_continuation')
        next_pk = x_ms_continuation['nextpartitionkey']
        next_rk = x_ms_continuation['nextrowkey']
    else:
        break;

但是当我运行它时,我得到以下异常:

TypeError was unhandled by user code
Message: query_entities() got an unexpected keyword argument 'next_partition_key'

因此看起来api已经从编写示例时发生了变化,我无法确定新的api是什么。

我查看了github并且在方法调用中引用了一个标记对象,但我不清楚如何使用它。任何例子都会有所帮助。 https://github.com/Azure/azure-storage-python/blob/master/azure/storage/table/tableservice.py

 def _query_entities(self, table_name, filter=None, select=None, max_results=None, marker=None, accept=TablePayloadFormat.JSON_MINIMAL_METADATA, property_resolver=None, timeout=None, _context=None): 

3 个答案:

答案 0 :(得分:2)

看看Github代码:

mylist <- lapply(mylist, function(x) split(x, x$var2))

> mylist
$A
$A$A_1
  var1 var2 val
1    A  A_1   1

$A$A_2
  var1 var2 val
2    A  A_2   2

$A$B_1
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0)

$A$B_2
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0)


$B
$B$A_1
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0)

$B$A_2
[1] var1 var2 val 
<0 Zeilen> (oder row.names mit Länge 0)

$B$B_1
  var1 var2 val
3    B  B_1   3

$B$B_2
  var1 var2 val
4    B  B_2   4

从这种语法中,您必须将def _query_entities(self, table_name, filter=None, select=None, max_results=None, marker=None, accept=TablePayloadFormat.JSON_MINIMAL_METADATA, property_resolver=None, timeout=None, _context=None): ... next_partition_key = None if marker is None else marker.get('nextpartitionkey') 关键字参数初始化为词典(marker)并将dict(而非marker['nextpartitionkey'])设置为您想要的值。< / p>

'next_partition_key'

此外,您应该从代码中删除xa = table_service.query_entities(..., marker={'nextpartitionkey'= ...}, ...) 关键字参数,并以相同的方式初始化next_row_key

答案 1 :(得分:2)

我尝试成功重现该问题,然后我发现问题是由代码中的query_entities方法引起的,该方法与您安装的azure-storage软件包版本不兼容。

根据GitHub的源代码,您可以找到版本差异如下。

在版本v0.20.x中,例如,最新版本v0.20.3the method query_entities definition如下所示,它具有参数next_partition_key&amp; next_row_key

def query_entities(self, table_name, filter=None, select=None, top=None, 
                   next_partition_key=None, next_row_key=None):

但在v0.20.3之后,the method definition (for example v0.33.0)更改为@DmitryFrolov说,如下所示。

def query_entities(self, table_name, filter=None, select=None, num_results=None,
                   marker=None, accept=TablePayloadFormat.JSON_MINIMAL_METADATA,
                   property_resolver=None, timeout=None):

因此有两种解决方案可以解决问题。

  1. 通过命令pip uninstall azure-storage&amp ;;回滚软件包版本pip install azure-storage==0.20.3,那么您的代码就可以了。
  2. 在您当前的版本中,正如@DmitryFrolov所说,构建一个marker对象以包含参数next_partition_key&amp; next_row_key用于关注新用法。

答案 2 :(得分:0)

使用azure-storage 0.34.3 ,我可以使用以下代码:

table_service = TableService(account_name, account_key)
i=0
marker = None
while True:
    tasks = table_service.query_entities(table_name, data_filter,
                                         marker = marker,
                                         num_results=1000)
    for task in tasks:
      i += 1
      print(task)
    if tasks.next_marker is not None and len(tasks.next_marker) > 0:
      marker = tasks.next_marker
    else:
        break


print i

请注意,您不再需要构建自己的标记对象。只需使用传回给你的那个,并检查标记词典实际上是否有一些内容;如果有更多行要处理,标记词典应该有两个项目。