A Python package to operate with Feishu/Lark bitable
pip install bitable
from bitable import Table
table = Table(BASE_ID, AUTH_TOKEN, 'TABLE_NAME')
# you may also use table_id: Table(BASE_ID, AUTH_TOKEN, table_id=TABLE_ID)
# select records
records = table.select() # select all records
records = table.select({'field_name1': 'value1', 'field_name2': 'value2'}) # select with conditions
records = table.select(Greater('FieldValue', 90))
records = table.select(Or(Greater('FieldValue', 90), And({'FieldSingle': 'A'}, Contain('FieldText', 'text_value')))) # select with complex conditions
# insert records
table.insert({'field_name1': 'value1', 'field_name2': 'value2'}) # insert a record
table.insert([{'field_name1': 'value1', 'field_name2': 'value2'}, {'field_name1': 'value3', 'field_name2': 'value4'}]) # insert multiple records
# update records
table.update({'FieldMultiple': ['B', 'A'], 'FieldDate':'2024-12-21'}, where={'FieldText': 'text_value'}) # update records with where conditions
result = table.select({'FieldText': 'HelloTestUpdate'})[0]
result['FieldText'] = 'new_value'
table.update(result) # update records with record object
# delete records
self.table.delete(where={'FieldText': 'HelloDelete'}) # with where condition
result = table.select({'FieldText': 'HelloTestUpdate'})[0]
self.table.delete(results) # with selected objectfrom bitable import Table
table = Table(BASE_ID, BASE_TOKEN, 'TABLE_NAME')BASE_ID can be found at the bitable's URL after 'base/'

AUTH_TOKEN can be found following these steps:
-
click the "Base extensions" icon on the top right:
select all records with just select():
records = table.select()every record is a dict of field name => value. With '_id' key for the record id additionally.
simple conditions like x==y can be passed in as a dict:
records = table.select({'field_name1': 'value1', 'field_name2': 'value2'}) use operators to construct complex conditions:
records = table.select(Greater('FieldValue', 90))
records = table.select(Or(Greater('FieldValue', 90), And({'FieldSingle': 'A'}, Contain('FieldText', 'text_value'))))list of operators:
- Equal: "==" operator
- Not: "!=" operator
- Contain: if a string field contains a substring, or a multiple-select field contains an element
- NotContain
- Empty
- NotEmpty
- Greater: ">" operator
- GreaterEqual ">=" operator
- Less
- LessEqual
for date fields, use 'YYYY-mm-dd' format, or one of the following:
Today(), Yesterday(), Tomorrow(), CurrentWeek(), LastWeek(), CurrentMonth(), LastMonth(), Past7Days(), Next7Days(), Past30Days(), Next30Days()
insert a record with insert():
table.insert({'field_name1': 'value1', 'field_name2': 'value2'})insert multiple records with a list:
table.insert([{'field_name1': 'value1', 'field_name2': 'value2'}, {'field_name1': 'value3', 'field_name2': 'value4'}])if record is a record dict selected from the table, you can change its content, and update it with update():
(in fact, it uses '_id' key to locate the record)
table.update(record)you can also update records with where conditions:
table.update({'field_name1': 'new_value1', 'field_name2':'new_value2'}, where={'condition_field_name': 'text_value'})delete a record selected from the table with delete():
(similar to update(), it uses '_id' key to locate which record to delete)
table.delete(record)batch delete records with where conditions:
table.delete(where={'field_name': 'field_value'})
