pykintoneを使ったレコードの全件取得のエンド判定

pykintoneを使ってレコードを全件取得しようと下記のプログラムを組みました。

一応、動いて全件取得できたのですが、あらかじめ件数が分かっているのでOffsetをずらして最後まで読むことが出来ました。

件数が分かっていない場合に終了の判定をするには、どうすればいいのでしょうか?

(サブドメイン名、ID、APIトークンはマスクしています)

import pykintone

f = open(‘customerName.txt’,‘w’)

ofs =“”

for i in range(3):
if i==1:
ofs=“offset 500”
elif i==2:
ofs=“offset 1000”

r = pykintone.app(“XXXXXX”, “nn”, “YYYYYYYYYYYY”).select(“limit 500”+ofs)

if r.ok:
records = r.records
for rec in records:
print(rec[‘customerSiteName’][‘value’])
f.write(rec[‘customerSiteName’][‘value’]+‘’)
else:
print(r.error)

f.close()

読み込んだレコードが、リミットの500より小さければ終了させる下記のプログラムに書き換えてみましたが、いまいちですね。

EOFの判定などは出来ないですかね?

import pykintone
import sys

f = open(‘customerName.txt’,‘w’)

ofs =“”

for i in range(10):
if i==1:
ofs=“offset 500”
elif i==2:
ofs=“offset 1000”
else:
ofs=“”

r = pykintone.app(“XXXXXXXX”, “nn”, “yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy”).select(“limit 500”+ofs)

if r.ok:
records = r.records
for rec in records:
print(rec[‘customerSiteName’][‘value’]+rec[‘address’][‘value’])

f.write(rec[‘customerSiteName’][‘value’]+rec[‘address’][‘value’]+‘’)

else:
print(r.error)
print (len(records))
if len(records) < 500:
f.close()
sys.exit()

 

もう解決されているかもしれませんが、コメントします。

私の場合は、JavaScriptでの全レコード取得と同様の考え方で処理を書いています。

 

500件ずつレコードを取得していって、取得結果が0になったら処理を抜けます。

例:

import pykintone

account = pykintone.load("account.yml")
app = account.app()

ofs = 0
lim = 500
while True:
r = app.select("limit " + str(lim) + " offset " + str(ofs))
if not r.ok:
print(r.error)
break

records = r.records
if records == []:
print("Nothing!")
break
else:
print(ofs + len(records))
ofs += lim

 

Pythonは勉強中なので、もし他によい書き方を知っていたら共有してください^^

こんにちは。質問者様と同じ疑問がありまして、参考にさせて頂きつつ書いてみました。

私の場合は、Select結果をModelと辞書の両方の形で取り扱いをしたかったので以下のように組んでみました。

import&nbsp;os

import&nbsp;pykintone

from&nbsp;pykintone&nbsp;import&nbsp;model

LIMIT&nbsp;=&nbsp;100

OFFSET&nbsp;=&nbsp;0

&nbsp;

#&nbsp;#&nbsp;kintone\_accounts.yml

#&nbsp;domain:&nbsp;{$DOMAIN}

#&nbsp;apps:

#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;users:

#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:&nbsp;{$APP\_ID\_USERS}

#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token:&nbsp;{$API\_TOKEN}

ACCOUNT\_FILE&nbsp;=&nbsp;os.getenv("KINTONE\_ACCOUNT\_FILE",&nbsp;default="kintone\_accounts.yml")

class&nbsp;User(model.kintoneModel):

&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;\_\_init\_\_(self,&nbsp;user\_id="",&nbsp;user\_name=""):

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(User,&nbsp;self).\_\_init\_\_()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.user\_id&nbsp;=&nbsp;user\_id

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.user\_name&nbsp;=&nbsp;user\_name

def&nbsp;select\_all(app,&nbsp;model=None,&nbsp;query="",&nbsp;fields=[]):

&nbsp;&nbsp;&nbsp;&nbsp;'''Select結果全件を得る

&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;Args:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;(pykintone.application.Application):&nbsp;[description]

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model&nbsp;(pykintone.model.kintoneModel,&nbsp;optional):&nbsp;Select結果を受け取るModel.&nbsp;Defaults&nbsp;to&nbsp;None.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query&nbsp;(str,&nbsp;optional):&nbsp;Selectクエリ.&nbsp;Defaults&nbsp;to&nbsp;"".

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fields&nbsp;(list&nbsp;of&nbsp;str):&nbsp;取得する列のリスト.&nbsp;Defaults&nbsp;to&nbsp;[].

&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;Returns:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;pykintone.model\_result.SelectResult

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;list&nbsp;of&nbsp;pykintone.model.kintoneModel

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]:&nbsp;Select結果全件.&nbsp;modelパラメータを指定した場合はModel型のリストを返す。

&nbsp;&nbsp;&nbsp;&nbsp;'''

&nbsp;&nbsp;&nbsp;&nbsp;ofs&nbsp;=&nbsp;OFFSET

&nbsp;&nbsp;&nbsp;&nbsp;lim&nbsp;=&nbsp;LIMIT

&nbsp;&nbsp;&nbsp;&nbsp;records&nbsp;=&nbsp;[]

&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;True:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;app.select(query="{q}&nbsp;limit&nbsp;{l}&nbsp;offset&nbsp;{o}".format(q=query,&nbsp;l=lim,&nbsp;o=ofs),&nbsp;fields=fields)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ofs&nbsp;+=&nbsp;lim

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;r.ok:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;records&nbsp;=&nbsp;[\*records,&nbsp;\*r.models(model)]&nbsp;if&nbsp;model&nbsp;else&nbsp;[\*records,&nbsp;\*r.records]

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;r.total\_count&nbsp;\<=&nbsp;ofs:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;records

if&nbsp;\_\_name\_\_&nbsp;==&nbsp;"\_\_main\_\_":

&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;=&nbsp;pykintone.load(ACCOUNT\_FILE).app(app\_id=os.getenv("APP\_ID\_USERS"))

&nbsp;&nbsp;&nbsp;&nbsp;users1&nbsp;=&nbsp;select\_all(app,&nbsp;model=User,&nbsp;query="レコード番号&nbsp;=&nbsp;1",&nbsp;fields=["user\_name"])

&nbsp;&nbsp;&nbsp;&nbsp;users2&nbsp;=&nbsp;select\_all(app,&nbsp;query="レコード番号&nbsp;=&nbsp;1",&nbsp;fields=["user\_name"])