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 os
import pykintone
from pykintone import model
LIMIT = 100
OFFSET = 0
# # kintone\_accounts.yml
# domain: {$DOMAIN}
# apps:
# users:
# id: {$APP\_ID\_USERS}
# token: {$API\_TOKEN}
ACCOUNT\_FILE = os.getenv("KINTONE\_ACCOUNT\_FILE", default="kintone\_accounts.yml")
class User(model.kintoneModel):
def \_\_init\_\_(self, user\_id="", user\_name=""):
super(User, self).\_\_init\_\_()
self.user\_id = user\_id
self.user\_name = user\_name
def select\_all(app, model=None, query="", fields=[]):
'''Select結果全件を得る
Args:
app (pykintone.application.Application): [description]
model (pykintone.model.kintoneModel, optional): Select結果を受け取るModel. Defaults to None.
query (str, optional): Selectクエリ. Defaults to "".
fields (list of str): 取得する列のリスト. Defaults to [].
Returns:
[
list of pykintone.model\_result.SelectResult
or list of pykintone.model.kintoneModel
]: Select結果全件. modelパラメータを指定した場合はModel型のリストを返す。
'''
ofs = OFFSET
lim = LIMIT
records = []
while True:
r = app.select(query="{q} limit {l} offset {o}".format(q=query, l=lim, o=ofs), fields=fields)
ofs += lim
if not r.ok:
raise
records = [\*records, \*r.models(model)] if model else [\*records, \*r.records]
if r.total\_count \<= ofs:
break
return records
if \_\_name\_\_ == "\_\_main\_\_":
app = pykintone.load(ACCOUNT\_FILE).app(app\_id=os.getenv("APP\_ID\_USERS"))
users1 = select\_all(app, model=User, query="レコード番号 = 1", fields=["user\_name"])
users2 = select\_all(app, query="レコード番号 = 1", fields=["user\_name"])