[Cosmos] CosmosDB asynchronous client - #21404
Merged
Merged
Conversation
* Removed some stuff * Looking at constructors * Updated request * Added client close * working client creation Co-authored-by: simorenoh <simonmorenohe@gmail.com>
database read works, but ignored exception is returned: Fatal error on SSL transport NoneType has no attribute 'send' (_loop._proactor.send) RuntimeError: Event loop is closed Unclosed connector/ connection
Added methods needed to use async with when initializing client, but logs output "Exception ignored... Runtime Error: Event loop is closed"
Move branch into local fork
missing upsert and other resources
missing read_all_items and both query methods for container class
Complete item CRUD functionality - only missing queries
Query functionality and container query methods
also fixed README and added examples_async
gahl-levy
reviewed
Dec 6, 2021
| url = os.environ['ACCOUNT_URI'] | ||
| key = os.environ['ACCOUNT_KEY'] | ||
| database_name = 'testDatabase' | ||
| container_name = 'products' |
Contributor
There was a problem hiding this comment.
ditto. I was a bit confused when I saw these being referred in the function below without realizing they are constants.
gahl-levy
reviewed
Dec 6, 2021
| 'productName': 'Widget', | ||
| 'productModel': 'Model {0}'.format(i) | ||
| } | ||
| ) |
Contributor
There was a problem hiding this comment.
Do we need to close the client here too?
await client.close()
Member
Author
There was a problem hiding this comment.
this is that second way to initialize I had mentioned above - the way it is done here, it gets disposed once the with statement gets exited
gahl-levy
reviewed
Dec 6, 2021
|
|
||
| ### Queries with the asynchronous client | ||
|
|
||
| Queries work the same way for the most part, with one exception being the absence of the `enable_cross_partition` flag in the request; queries without a specified partition key value will now by default atempt to do a cross partition query. Results can be directly iterated on, but because queries made by the asynchronous client return AsyncIterable objects, results can't be cast into lists directly; instead, if you need to create lists from your results, use Python's list comprehension to populate a list: |
Contributor
There was a problem hiding this comment.
Suggested change
| Queries work the same way for the most part, with one exception being the absence of the `enable_cross_partition` flag in the request; queries without a specified partition key value will now by default atempt to do a cross partition query. Results can be directly iterated on, but because queries made by the asynchronous client return AsyncIterable objects, results can't be cast into lists directly; instead, if you need to create lists from your results, use Python's list comprehension to populate a list: | |
| Queries work the same way for the most part, with one exception being the absence of the `enable_cross_partition` flag in the request; queries without a specified partition key value will now by default attempt to do a cross partition query. Results can be directly iterated on, but because queries made by the asynchronous client return AsyncIterable objects, results can't be cast into lists directly; instead, if you need to create lists from your results, use Python's list comprehension to populate a list: |
Contributor
There was a problem hiding this comment.
- Is this the reason that we don't have an await when querying? Should we make that more explicit?
- Why do we need the word "async" again in the function
- IIRC point queries operate differently. Should we add an example and explain the differentiation?
Member
Author
There was a problem hiding this comment.
- Yeah this is that point I had brought up with you before, I feel like I tried to explain it but I'm not sure it's completely understandable... let's talk on this to reach a conclusion.
- We need the word async in the function definition not because of the query, but because we do an
async forloop right after - any function that has eitherawaitorasyncwithin has to be defined as async by python - This is the case even for the normal sync client, and I believe should be documented in the actual Cosmos docs (not just SDK), found this for instance: https://devblogs.microsoft.com/cosmosdb/point-reads-versus-queries/
gahl-levy
reviewed
Dec 6, 2021
| from azure.cosmos.aio import CosmosClient | ||
| import os | ||
|
|
||
| url = os.environ['ACCOUNT_URI'] |
gahl-levy
reviewed
Dec 6, 2021
| container_name = 'products' | ||
| container = database.get_container_client(container_name) | ||
|
|
||
| async def create_lists(): |
Contributor
There was a problem hiding this comment.
Do we need to close the client in this example too? I'm not seeing "with" being used either.
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
gahl-levy
reviewed
Dec 6, 2021
Clarifying comments for README Co-authored-by: Gahl Levy <75269480+gahl-levy@users.noreply.github.com>
simorenoh
commented
Dec 7, 2021
simorenoh
commented
Dec 7, 2021
tjprescott
requested changes
Dec 7, 2021
simorenoh
commented
Dec 7, 2021
Co-authored-by: Simon Moreno <30335873+simorenoh@users.noreply.github.com>
tjprescott
approved these changes
Dec 7, 2021
tjprescott
enabled auto-merge (squash)
December 7, 2021 18:11
hildurhodd
pushed a commit
to hildurhodd/azure-sdk-for-python
that referenced
this pull request
Jan 4, 2022
* initial commit * Client Constructor (Azure#20310) * Removed some stuff * Looking at constructors * Updated request * Added client close * working client creation Co-authored-by: simorenoh <simonmorenohe@gmail.com> * read database database read works, but ignored exception is returned: Fatal error on SSL transport NoneType has no attribute 'send' (_loop._proactor.send) RuntimeError: Event loop is closed Unclosed connector/ connection * Update simon_testfile.py * with coroutine Added methods needed to use async with when initializing client, but logs output "Exception ignored... Runtime Error: Event loop is closed" * Update simon_testfile.py * small changes * async with returns no exceptions * async read container * async item read * cleaning up * create item/ database methods * item delete working * docs replace functionality missing upsert and other resources * upsert functionality missing read_all_items and both query methods for container class * missing query methods * CRUD for udf, sproc, triggers * initial query logic + container methods * missing some execution logic and tests * oops * fully working queries * small fix to query_items() also fixed README and added examples_async * Update _cosmos_client_connection_async.py * Update _cosmos_client_connection.py * documentation update * updated MIT dates and get_user_client() description * Update CHANGELOG.md * Delete simon_testfile.py * leftover retry utility * Update README.md * docs and removed six package * changes based on comments still missing discussion resolution on SSL verification and tests for async functionality under test module (apart from samples which are basically end to end tests) * small change in type hints * updated readme * fixes based on conversations * added missing type comments * update changelog for ci pipeline * added typehints, moved params into keywords, added decorators, made _connection_policy private * changes based on sync with central sdk * remove is_system_key from scripts (only used in execute_sproc) is_system_key verifies that an empty partition key is properly dealt with if ['partitionKey']['systemKey'] exists in the container options - however, we do not allow containers to be created with empty partition key values in the python sdk, so the functionality is needless * Revert "remove is_system_key from scripts (only used in execute_sproc)" Reverting last commit, will find way to init is_system_key for now * async script proxy using composition * pylint * capitalized constants * Apply suggestions from code review Clarifying comments for README Co-authored-by: Gahl Levy <75269480+gahl-levy@users.noreply.github.com> * closing python code snippet * last doc updates * Update sdk/cosmos/azure-cosmos/CHANGELOG.md Co-authored-by: Simon Moreno <30335873+simorenoh@users.noreply.github.com> Co-authored-by: annatisch <antisch@microsoft.com> Co-authored-by: Gahl Levy <75269480+gahl-levy@users.noreply.github.com> Co-authored-by: Travis Prescott <tjprescott@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the changes for the working language-native asynchronous client for cosmosdb. The async samples that were added showcase how the different functions can be used with async/await, and serve to show end to end functionality of each resource.
Any and all feedback is appreciated!