Table objects describe Registry Tables. A Table object can either be instantiated via a call to Project.list_tables() or directly using its ID.
Tables are for the most part lazy, in that they don’t perform any network requests without an explicit call to Table.load() or to a property getter. Two exceptions to this are Table.list_records() and Table.update(), both of which are discussed below.
Instance Methods
Table.load(), if called, will perform a network request and cache values for each of theTable’s properties.Table.list_records()will return a generator that yields a paginated dictionary ofRecords that are present in the callingTable. The keys of this dictionary are Record IDs and the values are the correspondingRecordobjects. This function also takes an optional keyword-onlypage_sizeargument that dictates the size of the returned page. The value of this argument must be a postive integer. If not provided, the default is a page size of 100. Pages are ordered by Record ID, with lower IDs being yielded first.
Table.list_records() is below.
Table.list_records() will always perform a network request for each returned page.
Property Getters
All property getters have an optionalload_if_missing boolean argument which, if True, will call Account.load() if the requested property has not been loaded already. This defaults to True.
Table.get_display_name()will return thedisplay_nameof the callingTableas a stringTable.get_columns()will return a dictionary containing the columns of the callingTable. The keys of the dictionary are column names, and its values areColumnobjects.Columnis a convenience dataclass with the propertiesColumn.key: the key of the column.Column.type: the (python) type of the column.Column.upstream_type: similar toColumn.type. However, this is a dataclass which contains an internal representation of the column’s data type, and should not be accessed or modified directly.
Updater
ATable can be modified by using the Table.update() function. Table.update() returns a context manager (and hence must be called using with syntax) with the following methods:
Upsert a record
upsert_record(record_name: str, column_data: Dict[str, Any])will either (up)date or in(sert) a record with namerecord_namewith the column values prescribed incolumn_data.
Each key of
column_data must be a valid column key (meaning that there must be a column in the calling Table with the same key), and the value corresponding to that key must be same type as the column (meaning that it is an instance of the column’s (python) type).Delete a record
delete_record(name: str)will delete the record with namename. If no such record exists, the method call will be a noop.
Upsert a column
upsert_column(key: str, type: RegistryPythonType, *, required: bool = False)will create a column with keykeyand typetype. For now, updating column types (i.e. callingupsert_columnwith a key that already exists, and a type that differs from the type of the column) is not allowed, and attempting to do so will raise an exception.
Export to pandas
A Table can be exported as a pandas.DataFrame using the Table.get_dataframe() function. This requires pandas to be installed. Doing so will load the entire table from the network into memory, so it can be costly for larger tables.
Planned Methods (Not Implemented Yet)
delete_column(column_name: str)
Table.
record 1 and record 2, with the provided values for the column Size.
When using an updater, no network requests are made until the end of the with block. This mimics transactions in relational database systems, and has several similar behaviors, namely that
- If any exception is thrown inside the
withblock, none of the updates made inside thewithblock will be sent over the network, so no changes will be made to theTable. - All updates are made at once in a single network request at the end of the
withblock. This significantly boosts performance when a large amount of updates are made at once.