皆さんはAirtableのレコードをどのように取得していますか?GUIからでしょうか?それとも Web APIからでしょうか?Web APIを利用している方はご存じだと思いますが、AirtableのWeb APIはページング処理が必要なため、直接利用するには若干の手間がかかります。そこで今回おすすめする対応策がpyAirtableです。
そもそもAirtableとは?
AirtableはいわばMS AccessのWeb版で、カジュアルにRDBを構築できるWebサービスです。そのカジュアルさとSaaS連携の容易性が評価されてか、シリーズF時点での評価額は$1.4Bを超え、ユニコーン企業となっています(最近大規模なレイオフをしていましたが)。わたしは業務でも非業務でも、Web APIを活用したデータ連携の検証をする場合に利用することが多いです。今回はpyAirtableを利用して、Airtableのデータを取得し、さらに更新するための使い方を紹介したいと思います。
そしてpyAirtableとは?
pyAirtableはAirtableのWeb APIを使いやすくしてくれるラッパーです。AirtableのWeb APIの使いにくい箇所をより直感的に利用できるようにしてくれます。もともとはAirtable Python Wrapperという名前だったのですが、2021年8月頃に大幅なリライト共に、pyAirtableという名前に変更されたようです。このエントリではpyAirtableを利用したレコードの取得と素のWeb APIを利用した場合の差分を紹介したいと思います。
pyAirtableを利用したレコードの取得
pyAirtableはものすごくシンプルにデータを取得できます。テーブルからレコードを取得し、表示するだけであれば以下のコードで済みます。
from pyairtable import Api, Base, Table table = Table('apikey', 'base_id', 'table_name') table.all() for records in table.iterate(page_size=100, max_records=1000): print(records)
一方、pyAirtableではなくRequestsを利用した場合は以下のようなコードになります。
def get_table_with_offset(offset: str = None) -> Response: params = {'page_size': 100, 'maxRecords': 1000} if offset is not None: params['offset'] = offset return requests.get(url=f"https://api.airtable.com/v0/{base_id}/{table_name}", headers={'Authorization': f"Bearer {api_key}"}, params=params) if __name__ == '__main__': response = get_table_with_offset() for record in response.json()['records']: print(record)
ただしこのコードでは取得するレコードの件数が100件を超えている場合にはページング処理をする必要があります。ページング処理を考慮したコードは以下のようになります。
if __name__ == '__main__': response = get_table_with_offset() while 'offset' in response.json(): response = get_table_with_offset(response.json()['offset']) for record in response.json()['records']: print(record)
pyAirtableを利用した場合よりもoffsetの判定が必要な分、少し冗長な気がしますね。
おわりに
このようにpyAirtableを使うとより直感的にAirtableからデータセットを取得できます。実はこのpyAirtableですが、AirtableオフィシャルのAPI Referenceでも紹介されています。このようなライブラリを活用して、Airtableをより使いこなせると業務が捗りそうですね!