我在此论坛中使用以下模式从表存储中提取数据:
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):
答案 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.3
,the 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):
因此有两种解决方案可以解决问题。
pip uninstall azure-storage
&amp ;;回滚软件包版本pip install azure-storage==0.20.3
,那么您的代码就可以了。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
请注意,您不再需要构建自己的标记对象。只需使用传回给你的那个,并检查标记词典实际上是否有一些内容;如果有更多行要处理,标记词典应该有两个项目。