From b46b2c7647b4e593b34a9495ac7bbf690d077d62 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 9 Mar 2026 12:28:38 +0530 Subject: [PATCH 1/2] docs: update Python quickstart with Pydantic models for type-safe data access - Add Pydantic Todo model for type-safe row operations - Update seed_database() to use model instances with model_dump() - Update list_rows() calls to use model_type parameter - Fix dictionary access to use attribute access (todo.data.title) - Update pip install command to use latest version - Add uv install alternative --- .../databases/operators/+page.markdoc | 8 +- .../databases/transactions/+page.markdoc | 10 +- .../docs/quick-starts/python/+page.markdoc | 113 ++++++++++-------- 3 files changed, 75 insertions(+), 56 deletions(-) diff --git a/src/routes/docs/products/databases/operators/+page.markdoc b/src/routes/docs/products/databases/operators/+page.markdoc index c243585363..c45b995729 100644 --- a/src/routes/docs/products/databases/operators/+page.markdoc +++ b/src/routes/docs/products/databases/operators/+page.markdoc @@ -2101,11 +2101,11 @@ result = tablesDB.update_row( 'upvotes': Operator.increment(1), 'lastModified': Operator.dateSetNow() }, - transaction_id=tx['$id'] + transaction_id=tx.id ) # Commit the transaction -tablesDB.update_transaction(tx['$id'], 'commit') +tablesDB.update_transaction(tx.id, 'commit') ``` ```server-dotnet using Appwrite; @@ -2580,7 +2580,7 @@ tx = tablesDB.create_transaction() # Stage multiple operations at once using createOperations tablesDB.create_operations( - transaction_id=tx['$id'], + transaction_id=tx.id, operations=[ { 'action': 'update', @@ -2605,7 +2605,7 @@ tablesDB.create_operations( ) # Commit the transaction -tablesDB.update_transaction(tx['$id'], 'commit') +tablesDB.update_transaction(tx.id, 'commit') ``` ```server-dotnet using Appwrite; diff --git a/src/routes/docs/products/databases/transactions/+page.markdoc b/src/routes/docs/products/databases/transactions/+page.markdoc index e89e2f88aa..12602c3dbb 100644 --- a/src/routes/docs/products/databases/transactions/+page.markdoc +++ b/src/routes/docs/products/databases/transactions/+page.markdoc @@ -460,7 +460,7 @@ tablesDB.upsert_row( table_id = '', row_id = '', data = { 'name': 'Walter' }, - transaction_id = tx['$id'] + transaction_id = tx.id ) # Decrement inside a transaction @@ -470,7 +470,7 @@ tablesDB.decrement_row_column( row_id = '', column = 'credits', value = 1, - transaction_id = tx['$id'] + transaction_id = tx.id ) ``` ```server-php @@ -668,7 +668,7 @@ await tablesDB.createOperations({ ``` ```server-python tablesDB.create_operations( - transaction_id = tx['$id'], + transaction_id = tx.id, operations = [ { 'action': 'create', @@ -1072,13 +1072,13 @@ await tablesDB.updateTransaction({ ```server-python # Commit tablesDB.update_transaction( - transaction_id = tx['$id'], + transaction_id = tx.id, commit = True ) # Roll back tablesDB.update_transaction( - transaction_id = tx['$id'], + transaction_id = tx.id, rollback = True ) ``` diff --git a/src/routes/docs/quick-starts/python/+page.markdoc b/src/routes/docs/quick-starts/python/+page.markdoc index 3ff9e1342b..a84dbf7ce3 100644 --- a/src/routes/docs/quick-starts/python/+page.markdoc +++ b/src/routes/docs/quick-starts/python/+page.markdoc @@ -75,8 +75,15 @@ Finally, create a file `my_app.py`. Install the Python Appwrite SDK. ```sh -pip install appwrite==13.6.1 +pip install appwrite ``` + +Or with `uv`: + +```sh +uv add appwrite +``` + {% /section %} {% section #step-4 step=4 title="Import Appwrite" %} @@ -105,9 +112,18 @@ client.set_key('') {% /section %} {% section #step-5 step=5 title="Initialize database" %} -Once the Appwrite Client is initialized, create a function to configure a todo table. +Once the Appwrite Client is initialized, define a Pydantic model for type-safe data access and create a function to configure a todo table. ```py +from pydantic import BaseModel +from typing import Optional + +# Define a Pydantic model matching the table schema +class Todo(BaseModel): + title: str + description: Optional[str] = None + isComplete: bool + tablesDB = TablesDB(client) todoDatabase = None @@ -123,30 +139,30 @@ def prepare_database(): ) todoTable = tablesDB.create_table( - database_id=todoDatabase['$id'], + database_id=todoDatabase.id, table_id=ID.unique(), name='Todos' ) tablesDB.create_varchar_column( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, key='title', size=255, required=True ) tablesDB.create_text_column( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, key='description', required=False, default='This is a test description.' ) tablesDB.create_boolean_column( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, key='isComplete', required=True ) @@ -158,42 +174,42 @@ Create a function to add some mock data into your new table. ```py def seed_database(): - testTodo1 = { - 'title': "Buy apples", - 'description': "At least 2KGs", - 'isComplete': True - } - - testTodo2 = { - 'title': "Wash the apples", - 'isComplete': True - } - - testTodo3 = { - 'title': "Cut the apples", - 'description': "Don\'t forget to pack them in a box", - 'isComplete': False - } + testTodo1 = Todo( + title="Buy apples", + description="At least 2KGs", + isComplete=True + ) + + testTodo2 = Todo( + title="Wash the apples", + isComplete=True + ) + + testTodo3 = Todo( + title="Cut the apples", + description="Don\'t forget to pack them in a box", + isComplete=False + ) tablesDB.create_row( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, row_id=ID.unique(), - data=testTodo1 + data=testTodo1.model_dump() ) tablesDB.create_row( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, row_id=ID.unique(), - data=testTodo2 + data=testTodo2.model_dump() ) tablesDB.create_row( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, row_id=ID.unique(), - data=testTodo3 + data=testTodo3.model_dump() ) ``` @@ -207,20 +223,22 @@ then execute the functions in `_main_`. from appwrite.query import Query def get_todos(): - # Retrieve rows (default limit is 25) + # Retrieve rows with type-safe access (default limit is 25) todos = tablesDB.list_rows( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'] + database_id=todoDatabase.id, + table_id=todoTable.id, + model_type=Todo ) print("Todos:") - for todo in todos['rows']: - print(f"Title: {todo['title']}\nDescription: {todo['description']}\nIs Todo Complete: {todo['isComplete']}\n\n") + for todo in todos.rows: + print(f"Title: {todo.data.title}\nDescription: {todo.data.description}\nIs Todo Complete: {todo.data.isComplete}\n\n") def get_completed_todos(): # Use queries to filter completed todos with pagination todos = tablesDB.list_rows( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, + model_type=Todo, queries=[ Query.equal("isComplete", True), Query.order_desc("$createdAt"), @@ -228,22 +246,23 @@ def get_completed_todos(): ] ) print("Completed todos (limited to 5):") - for todo in todos['rows']: - print(f"Title: {todo['title']}\nDescription: {todo['description']}\nIs Todo Complete: {todo['isComplete']}\n\n") + for todo in todos.rows: + print(f"Title: {todo.data.title}\nDescription: {todo.data.description}\nIs Todo Complete: {todo.data.isComplete}\n\n") def get_incomplete_todos(): # Query for incomplete todos todos = tablesDB.list_rows( - database_id=todoDatabase['$id'], - table_id=todoTable['$id'], + database_id=todoDatabase.id, + table_id=todoTable.id, + model_type=Todo, queries=[ Query.equal("isComplete", False), Query.order_asc("title") ] ) print("Incomplete todos (ordered by title):") - for todo in todos['rows']: - print(f"Title: {todo['title']}\nDescription: {todo['description']}\nIs Todo Complete: {todo['isComplete']}\n\n") + for todo in todos.rows: + print(f"Title: {todo.data.title}\nDescription: {todo.data.description}\nIs Todo Complete: {todo.data.isComplete}\n\n") if __name__ == "__main__": prepare_database() From 79a6208ab6d6e8e5e87c92f67174121454ecea28 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 9 Mar 2026 12:36:44 +0530 Subject: [PATCH 2/2] update sdk versions --- src/routes/docs/sdks/+page.markdoc | 64 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/routes/docs/sdks/+page.markdoc b/src/routes/docs/sdks/+page.markdoc index 0552566299..be34b6aa3b 100644 --- a/src/routes/docs/sdks/+page.markdoc +++ b/src/routes/docs/sdks/+page.markdoc @@ -20,31 +20,31 @@ Client libraries for integrating with Appwrite to build client-based application --- * {% only_dark %}{% icon_image src="/images/platforms/dark/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_light %} -* Web SDK `21.0.0` +* Web SDK `23.0.0` * [appwrite/sdk-for-web](https://github.com/appwrite/sdk-for-web) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/flutter.svg" alt="Flutter logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/flutter.svg" alt="Flutter logo" size="m" /%}{% /only_light %} -* Flutter SDK `20.0.0` +* Flutter SDK `22.0.0` * [appwrite/sdk-for-flutter](https://github.com/appwrite/sdk-for-flutter) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/react.svg" alt="React logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/react.svg" alt="React logo" size="m" /%}{% /only_light %} -* React Native SDK `0.15.0` +* React Native SDK `0.25.0` * [appwrite/sdk-for-react-native](https://github.com/appwrite/sdk-for-react-native) * `beta` --- * {% only_dark %}{% icon_image src="/images/platforms/dark/apple.svg" alt="Apple logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/apple.svg" alt="Apple logo" size="m" /%}{% /only_light %} -* Apple SDK `13.0.0` +* Apple SDK `15.0.0` * [appwrite/sdk-for-apple](https://github.com/appwrite/sdk-for-apple) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/android.svg" alt="Android logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/android.svg" alt="Android logo" size="m" /%}{% /only_light %} -* Android SDK `11.0.0` +* Android SDK `13.0.0` * [appwrite/sdk-for-android](https://github.com/appwrite/sdk-for-android) * {% /table %} @@ -61,55 +61,55 @@ Server libraries for integrating with Appwrite to build server side integrations --- * {% only_dark %}{% icon_image src="/images/platforms/dark/nodejs.svg" alt="Node.js logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/nodejs.svg" alt="Node.js logo" size="m" /%}{% /only_light %} -* Node.js SDK `20.0.0` +* Node.js SDK `22.1.3` * [appwrite/sdk-for-node](https://github.com/appwrite/sdk-for-node) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/python.svg" alt="Python logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/python.svg" alt="Python logo" size="m" /%}{% /only_light %} -* Python SDK `13.2.0` +* Python SDK `16.0.0` * [appwrite/sdk-for-python](https://github.com/appwrite/sdk-for-python) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/dart.svg" alt="Dart logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/dart.svg" alt="Dart logo" size="m" /%}{% /only_light %} -* Dart SDK `19.0.0` +* Dart SDK `21.3.0` * [appwrite/sdk-for-dart](https://github.com/appwrite/sdk-for-dart) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/php.svg" alt="PHP logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/php.svg" alt="PHP logo" size="m" /%}{% /only_light %} -* PHP SDK `17.2.0` +* PHP SDK `20.2.1` * [appwrite/sdk-for-php](https://github.com/appwrite/sdk-for-php) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/ruby.svg" alt="Ruby logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/ruby.svg" alt="Ruby logo" size="m" /%}{% /only_light %} -* Ruby SDK `19.0.0` +* Ruby SDK `21.1.0` * [appwrite/sdk-for-ruby](https://github.com/appwrite/sdk-for-ruby) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/dotnet.svg" alt=".NET logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/dotnet.svg" alt=".NET logo" size="m" /%}{% /only_light %} -* .NET SDK `0.19.0` +* .NET SDK `1.0.0` * [appwrite/sdk-for-dotnet](https://github.com/appwrite/sdk-for-dotnet) -* `beta` +* --- * {% only_dark %}{% icon_image src="/images/platforms/dark/go.svg" alt="Go logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/go.svg" alt="Go logo" size="m" /%}{% /only_light %} -* Go SDK `0.13.0` +* Go SDK `1.0.0` * [appwrite/sdk-for-go](https://github.com/appwrite/sdk-for-go) -* `beta` +* --- * {% only_dark %}{% icon_image src="/images/platforms/dark/swift.svg" alt="Swift logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/swift.svg" alt="Swift logo" size="m" /%}{% /only_light %} -* Swift SDK `13.0.0` +* Swift SDK `15.2.0` * [appwrite/sdk-for-swift](https://github.com/appwrite/sdk-for-swift) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/kotlin.svg" alt="Kotlin logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/kotlin.svg" alt="Kotlin logo" size="m" /%}{% /only_light %} -* Kotlin SDK `12.0.0` +* Kotlin SDK `14.1.0` * [appwrite/sdk-for-kotlin](https://github.com/appwrite/sdk-for-kotlin) * {% /table %} @@ -305,31 +305,31 @@ You can discover the available enums in each SDK at the source. --- * {% only_dark %}{% icon_image src="/images/platforms/dark/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/javascript.svg" alt="Javascript logo" size="m" /%}{% /only_light %} -* Web SDK `14.0.1` +* Web SDK `23.0.0` * [appwrite/sdk-for-web](https://github.com/appwrite/sdk-for-web/tree/dev/src/enums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/flutter.svg" alt="Flutter logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/flutter.svg" alt="Flutter logo" size="m" /%}{% /only_light %} -* Flutter SDK `12.0.3` +* Flutter SDK `22.0.0` * [appwrite/sdk-for-flutter](https://github.com/appwrite/sdk-for-flutter/tree/dev/lib/src/enums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/react.svg" alt="React logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/react.svg" alt="React logo" size="m" /%}{% /only_light %} -* React Native SDK `0.1.0` +* React Native SDK `0.25.0` * [appwrite/sdk-for-react-native](https://github.com/appwrite/sdk-for-react-native) -* `beta` +* --- * {% only_dark %}{% icon_image src="/images/platforms/dark/apple.svg" alt="Apple logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/apple.svg" alt="Apple logo" size="m" /%}{% /only_light %} -* Apple SDK `5.0.0` +* Apple SDK `15.0.0` * [appwrite/sdk-for-apple](https://github.com/appwrite/sdk-for-apple/tree/dev/Sources/AppwriteEnums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/android.svg" alt="Android logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/android.svg" alt="Android logo" size="m" /%}{% /only_light %} -* Android SDK `5.1.0` +* Android SDK `13.0.0` * [appwrite/sdk-for-android](https://github.com/appwrite/sdk-for-android/tree/dev/library/src/main/java/io/appwrite/enums) * {% /table %} @@ -346,55 +346,55 @@ You can discover the available enums in each SDK at the source. --- * {% only_dark %}{% icon_image src="/images/platforms/dark/nodejs.svg" alt="Node.js logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/nodejs.svg" alt="Node.js logo" size="m" /%}{% /only_light %} -* Node.js SDK `14.1.0` +* Node.js SDK `22.1.3` * [appwrite/sdk-for-node](https://github.com/appwrite/sdk-for-node/tree/dev/lib/enums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/python.svg" alt="Python logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/python.svg" alt="Python logo" size="m" /%}{% /only_light %} -* Python SDK `6.1.0` +* Python SDK `16.0.0` * [appwrite/sdk-for-python](https://github.com/appwrite/sdk-for-python/tree/dev/appwrite/enums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/dart.svg" alt="Dart logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/dart.svg" alt="Dart logo" size="m" /%}{% /only_light %} -* Dart SDK `12.1.0` +* Dart SDK `21.3.0` * [appwrite/sdk-for-dart](https://github.com/appwrite/sdk-for-dart/blob/dev/lib/enums.dart) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/php.svg" alt="PHP logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/php.svg" alt="PHP logo" size="m" /%}{% /only_light %} -* PHP SDK `12.1.0` +* PHP SDK `20.2.1` * [appwrite/sdk-for-php](https://github.com/appwrite/sdk-for-php/tree/dev/src/Appwrite/Enums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/ruby.svg" alt="Ruby logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/ruby.svg" alt="Ruby logo" size="m" /%}{% /only_light %} -* Ruby SDK `12.1.0` +* Ruby SDK `21.1.0` * [appwrite/sdk-for-ruby](https://github.com/appwrite/sdk-for-ruby/tree/dev/lib/appwrite/enums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/dotnet.svg" alt=".NET logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/dotnet.svg" alt=".NET logo" size="m" /%}{% /only_light %} -* .NET SDK `0.10.1` +* .NET SDK `1.0.0` * [appwrite/sdk-for-dotnet](https://github.com/appwrite/sdk-for-dotnet/tree/dev/src/Appwrite/Enums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/go.svg" alt="Go logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/go.svg" alt="Go logo" size="m" /%}{% /only_light %} -* Go SDK `0.2.0` +* Go SDK `1.0.0` * [appwrite/sdk-for-go](https://github.com/appwrite/sdk-for-go) -* `beta` +* --- * {% only_dark %}{% icon_image src="/images/platforms/dark/swift.svg" alt="Swift logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/swift.svg" alt="Swift logo" size="m" /%}{% /only_light %} -* Swift SDK `6.1.0` +* Swift SDK `15.2.0` * [appwrite/sdk-for-swift](https://github.com/appwrite/sdk-for-swift/tree/dev/Sources/AppwriteEnums) * --- * {% only_dark %}{% icon_image src="/images/platforms/dark/kotlin.svg" alt="Kotlin logo" size="m" /%}{% /only_dark %} {% only_light %}{% icon_image src="/images/platforms/kotlin.svg" alt="Kotlin logo" size="m" /%}{% /only_light %} -* Kotlin SDK `6.1.0` +* Kotlin SDK `14.1.0` * [appwrite/sdk-for-kotlin](https://github.com/appwrite/sdk-for-kotlin/tree/dev/src/main/kotlin/io/appwrite/enums) * {% /table %}