typedb-driver


Nametypedb-driver JSON
Version 3.0.5 PyPI version JSON
download
home_pagehttps://github.com/typedb/typedb-driver-python/
SummaryTypeDB Driver for Python
upload_time2025-01-31 16:22:19
maintainerNone
docs_urlNone
authorTypeDB Community
requires_python>0
licenseApache-2.0
keywords typedb database graph knowledgebase knowledge-engineering
VCS
bugtrack_url
requirements parse
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # TypeDB Python Driver

## Driver Architecture

To learn about the mechanism that TypeDB drivers use to set up communication with databases running on the TypeDB
Server, refer to the [Drivers Overview](https://typedb.com/docs/drivers/overview).

## API Reference

To learn about the methods available for executing queries and retrieving their answers using Python, refer to
the [API Reference](https://typedb.com/docs/drivers/python/api-reference).

## Install TypeDB Python Driver through Pip
1. Install `typedb-driver` using `pip`:
```bash
pip install typedb-driver
```
2. If multiple Python versions are available, you may wish to use:
```
pip3 install typedb-driver
```
3. Make sure the [TypeDB Server](https://docs.typedb.com/docs/running-typedb/install-and-run#start-the-typedb-server) is running.
4. In your python program, import from `typedb.driver` (see [Example usage](#example-usage) or `tests/integration` for examples):
```py
from typedb.driver import *

driver = TypeDB.core_driver(address=TypeDB.DEFAULT_ADDRESS)
```

## Example usage

### TypeDB Cloud / Enterprise (Cloud driver)

<!-- CLOUD_EXAMPLE_START_MARKER -->

```py
from typedb.driver import *


class TypeDBExample:

    def typedb_example():
        # Open a driver connection. The connection will be automatically closed on the "with" block exit
        with TypeDB.cloud_driver(TypeDB.DEFAULT_ADDRESS, Credentials("admin", "password"), DriverOptions()) as driver:
            # Create a database
            driver.databases.create("typedb")
            database = driver.databases.get("typedb")

            # Use "try" blocks to catch driver exceptions
            try:
                # Open transactions of 3 types
                tx = driver.transaction(database.name, TransactionType.READ)

                # Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception
                result_promise = tx.query("define entity i-cannot-be-defined-in-read-transactions;")

                print("The result is still promised, so it needs resolving even in case of errors!")
                result_promise.resolve()
            except TypeDBDriverException as expected_exception:
                print(f"Once the query's promise is resolved, the exception is revealed: {expected_exception}")
            finally:
                # Don't forget to close the transaction!
                tx.close()

            # Open a schema transaction to make schema changes
            # Use "with" blocks to forget about "close" operations (similarly to connections)
            with driver.transaction(database.name, TransactionType.SCHEMA) as tx:
                define_query = """
                define 
                  entity person, owns name, owns age; 
                  attribute name, value string;
                  attribute age, value integer;
                """
                answer = tx.query(define_query).resolve()
                if answer.is_ok():
                    print(f"OK results do not give any extra interesting information, but they mean that the query "
                          f"is successfully executed!")

                # Commit automatically closes the transaction. It can still be safely called inside "with" blocks
                tx.commit()

            # Open a read transaction to safely read anything without database modifications
            with driver.transaction(database.name, TransactionType.READ) as tx:
                answer = tx.query("match entity $x;").resolve()

                # Collect concept rows that represent the answer as a table
                rows = list(answer.as_concept_rows())
                row = rows[0]

                # Collect column names to get concepts by index if the variable names are lost
                header = list(row.column_names())

                column_name = header[0]

                # Get concept by the variable name (column name)
                concept_by_name = row.get(column_name)

                # Get concept by the header's index
                concept_by_index = row.get_index(0)

                print(f"Getting concepts by variable names ({concept_by_name.get_label()}) and "
                      f"indexes ({concept_by_index.get_label()}) is equally correct. ")

                # Check if it's an entity type before the conversion
                if concept_by_name.is_entity_type():
                    print(f"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' "
                          f"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')")

                # Continue querying in the same transaction if needed
                answer = tx.query("match attribute $a;").resolve()

                # Concept rows can be used as any other iterator
                rows = [row for row in answer.as_concept_rows()]

                for row in rows:
                    # Same for column names
                    column_names_iter = row.column_names()
                    column_name = next(column_names_iter)

                    concept_by_name = row.get(column_name)

                    # Check if it's an attribute type before the conversion
                    if concept_by_name.is_attribute_type():
                        attribute_type = concept_by_name.as_attribute_type()
                        print(f"Defined attribute type's label: '{attribute_type.get_label()}', "
                              f"value type: '{attribute_type.try_get_value_type()}'")


                    print(f"It is also possible to just print the concept itself: '{concept_by_name}'")

            # Open a write transaction to insert data
            with driver.transaction(database.name, TransactionType.WRITE) as tx:
                insert_query = "insert $z isa person, has age 10; $x isa person, has age 20, has name \"John\";"
                answer = tx.query(insert_query).resolve()

                # Insert queries also return concept rows
                rows = list(answer.as_concept_rows())
                row = rows[0]

                for column_name in row.column_names():
                    inserted_concept = row.get(column_name)
                    print(f"Successfully inserted ${column_name}: {inserted_concept}")
                    if inserted_concept.is_entity():
                        print("This time, it's an entity, not a type!")

                # It is possible to ask for the column names again
                header = [name for name in row.column_names()]

                x = row.get_index(header.index("x"))
                print(
                    "As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. ")
                if x.is_entity():
                    print(f"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}")

                # Do not forget to commit if the changes should be persisted
                tx.commit()

            # Open another write transaction to try inserting even more data
            with driver.transaction(database.name, TransactionType.WRITE) as tx:
                # When loading a large dataset, it's often better not to resolve every query's promise immediately.
                # Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,
                # just call `commit`, which will wait for all ongoing operations to finish before executing.
                queries = ["insert $a isa person, has name \"Alice\";", "insert $b isa person, has name \"Bob\";"]
                for query in queries:
                    tx.query(query)
                tx.commit()

            with driver.transaction(database.name, TransactionType.WRITE) as tx:
                # Commit will still fail if at least one of the queries produce an error.
                queries = ["insert $c isa not-person, has name \"Chris\";", "insert $d isa person, has name \"David\";"]
                promises = []
                for query in queries:
                    promises.append(tx.query(query))

                try:
                    tx.commit()
                    assert False, "TypeDBDriverException is expected"
                except TypeDBDriverException as expected_exception:
                    print(f"Commit result will contain the unresolved query's error: {expected_exception}")

            # Open a read transaction to verify that the previously inserted data is saved
            with driver.transaction(database.name, TransactionType.READ) as tx:
                # A match query can be used for concept row outputs
                var = "x"
                answer = tx.query(f"match ${var} isa person;").resolve()

                # Simple match queries always return concept rows
                count = 0
                for row in answer.as_concept_rows():
                    x = row.get(var)
                    x_type = x.as_entity().get_type().as_entity_type()
                    count += 1
                    print(f"Found a person {x} of type {x_type}")
                print(f"Total persons found: {count}")

                # A fetch query can be used for concept document outputs with flexible structure
                fetch_query = """
                match
                  $x isa! person, has $a;
                  $a isa! $t;
                fetch {
                  "single attribute type": $t,
                  "single attribute": $a,
                  "all attributes": { $x.* },
                };
                """
                answer = tx.query(fetch_query).resolve()

                # Fetch queries always return concept documents
                count = 0
                for document in answer.as_concept_documents():
                    count += 1
                    print(f"Fetched a document: {document}.")
                    print(f"This document contains an attribute of type: {document['single attribute type']['label']}")
                print(f"Total documents fetched: {count}")

        print("More examples can be found in the API reference and the documentation.\nWelcome to TypeDB!")
```

<!-- CLOUD_EXAMPLE_END_MARKER -->

### TypeDB CE (Core driver)

<!-- CORE_EXAMPLE_START_MARKER -->

```py
from typedb.driver import *


class TypeDBExample:

    def typedb_example():
        # Open a driver connection. The connection will be automatically closed on the "with" block exit
        with TypeDB.core_driver(TypeDB.DEFAULT_ADDRESS, Credentials("admin", "password"), DriverOptions()) as driver:
            # Create a database
            driver.databases.create("typedb")
            database = driver.databases.get("typedb")

            # Use "try" blocks to catch driver exceptions
            try:
                # Open transactions of 3 types
                tx = driver.transaction(database.name, TransactionType.READ)

                # Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception
                result_promise = tx.query("define entity i-cannot-be-defined-in-read-transactions;")

                print("The result is still promised, so it needs resolving even in case of errors!")
                result_promise.resolve()
            except TypeDBDriverException as expected_exception:
                print(f"Once the query's promise is resolved, the exception is revealed: {expected_exception}")
            finally:
                # Don't forget to close the transaction!
                tx.close()

            # Open a schema transaction to make schema changes
            # Use "with" blocks to forget about "close" operations (similarly to connections)
            with driver.transaction(database.name, TransactionType.SCHEMA) as tx:
                define_query = """
                define 
                  entity person, owns name, owns age; 
                  attribute name, value string;
                  attribute age, value integer;
                """
                answer = tx.query(define_query).resolve()
                if answer.is_ok():
                    print(f"OK results do not give any extra interesting information, but they mean that the query "
                          f"is successfully executed!")

                # Commit automatically closes the transaction. It can still be safely called inside "with" blocks
                tx.commit()

            # Open a read transaction to safely read anything without database modifications
            with driver.transaction(database.name, TransactionType.READ) as tx:
                answer = tx.query("match entity $x;").resolve()

                # Collect concept rows that represent the answer as a table
                rows = list(answer.as_concept_rows())
                row = rows[0]

                # Collect column names to get concepts by index if the variable names are lost
                header = list(row.column_names())

                column_name = header[0]

                # Get concept by the variable name (column name)
                concept_by_name = row.get(column_name)

                # Get concept by the header's index
                concept_by_index = row.get_index(0)

                print(f"Getting concepts by variable names ({concept_by_name.get_label()}) and "
                      f"indexes ({concept_by_index.get_label()}) is equally correct. ")

                # Check if it's an entity type before the conversion
                if concept_by_name.is_entity_type():
                    print(f"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' "
                          f"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')")

                # Continue querying in the same transaction if needed
                answer = tx.query("match attribute $a;").resolve()

                # Concept rows can be used as any other iterator
                rows = [row for row in answer.as_concept_rows()]

                for row in rows:
                    # Same for column names
                    column_names_iter = row.column_names()
                    column_name = next(column_names_iter)

                    concept_by_name = row.get(column_name)

                    # Check if it's an attribute type before the conversion
                    if concept_by_name.is_attribute_type():
                        attribute_type = concept_by_name.as_attribute_type()
                        print(f"Defined attribute type's label: '{attribute_type.get_label()}', "
                              f"value type: '{attribute_type.try_get_value_type()}'")


                    print(f"It is also possible to just print the concept itself: '{concept_by_name}'")

            # Open a write transaction to insert data
            with driver.transaction(database.name, TransactionType.WRITE) as tx:
                insert_query = "insert $z isa person, has age 10; $x isa person, has age 20, has name \"John\";"
                answer = tx.query(insert_query).resolve()

                # Insert queries also return concept rows
                rows = list(answer.as_concept_rows())
                row = rows[0]

                for column_name in row.column_names():
                    inserted_concept = row.get(column_name)
                    print(f"Successfully inserted ${column_name}: {inserted_concept}")
                    if inserted_concept.is_entity():
                        print("This time, it's an entity, not a type!")

                # It is possible to ask for the column names again
                header = [name for name in row.column_names()]

                x = row.get_index(header.index("x"))
                print(
                    "As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. ")
                if x.is_entity():
                    print(f"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}")

                # Do not forget to commit if the changes should be persisted
                tx.commit()

            # Open another write transaction to try inserting even more data
            with driver.transaction(database.name, TransactionType.WRITE) as tx:
                # When loading a large dataset, it's often better not to resolve every query's promise immediately.
                # Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,
                # just call `commit`, which will wait for all ongoing operations to finish before executing.
                queries = ["insert $a isa person, has name \"Alice\";", "insert $b isa person, has name \"Bob\";"]
                for query in queries:
                    tx.query(query)
                tx.commit()

            with driver.transaction(database.name, TransactionType.WRITE) as tx:
                # Commit will still fail if at least one of the queries produce an error.
                queries = ["insert $c isa not-person, has name \"Chris\";", "insert $d isa person, has name \"David\";"]
                promises = []
                for query in queries:
                    promises.append(tx.query(query))

                try:
                    tx.commit()
                    assert False, "TypeDBDriverException is expected"
                except TypeDBDriverException as expected_exception:
                    print(f"Commit result will contain the unresolved query's error: {expected_exception}")

            # Open a read transaction to verify that the previously inserted data is saved
            with driver.transaction(database.name, TransactionType.READ) as tx:
                # A match query can be used for concept row outputs
                var = "x"
                answer = tx.query(f"match ${var} isa person;").resolve()

                # Simple match queries always return concept rows
                count = 0
                for row in answer.as_concept_rows():
                    x = row.get(var)
                    x_type = x.as_entity().get_type().as_entity_type()
                    count += 1
                    print(f"Found a person {x} of type {x_type}")
                print(f"Total persons found: {count}")

                # A fetch query can be used for concept document outputs with flexible structure
                fetch_query = """
                match
                  $x isa! person, has $a;
                  $a isa! $t;
                fetch {
                  "single attribute type": $t,
                  "single attribute": $a,
                  "all attributes": { $x.* },
                };
                """
                answer = tx.query(fetch_query).resolve()

                # Fetch queries always return concept documents
                count = 0
                for document in answer.as_concept_documents():
                    count += 1
                    print(f"Fetched a document: {document}.")
                    print(f"This document contains an attribute of type: {document['single attribute type']['label']}")
                print(f"Total documents fetched: {count}")

        print("More examples can be found in the API reference and the documentation.\nWelcome to TypeDB!")
```

<!-- CORE_EXAMPLE_END_MARKER -->

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/typedb/typedb-driver-python/",
    "name": "typedb-driver",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">0",
    "maintainer_email": null,
    "keywords": "typedb database graph knowledgebase knowledge-engineering",
    "author": "TypeDB Community",
    "author_email": "community@typedb.com",
    "download_url": null,
    "platform": null,
    "description": "# TypeDB Python Driver\n\n## Driver Architecture\n\nTo learn about the mechanism that TypeDB drivers use to set up communication with databases running on the TypeDB\nServer, refer to the [Drivers Overview](https://typedb.com/docs/drivers/overview).\n\n## API Reference\n\nTo learn about the methods available for executing queries and retrieving their answers using Python, refer to\nthe [API Reference](https://typedb.com/docs/drivers/python/api-reference).\n\n## Install TypeDB Python Driver through Pip\n1. Install `typedb-driver` using `pip`:\n```bash\npip install typedb-driver\n```\n2. If multiple Python versions are available, you may wish to use:\n```\npip3 install typedb-driver\n```\n3. Make sure the [TypeDB Server](https://docs.typedb.com/docs/running-typedb/install-and-run#start-the-typedb-server) is running.\n4. In your python program, import from `typedb.driver` (see [Example usage](#example-usage) or `tests/integration` for examples):\n```py\nfrom typedb.driver import *\n\ndriver = TypeDB.core_driver(address=TypeDB.DEFAULT_ADDRESS)\n```\n\n## Example usage\n\n### TypeDB Cloud / Enterprise (Cloud driver)\n\n<!-- CLOUD_EXAMPLE_START_MARKER -->\n\n```py\nfrom typedb.driver import *\n\n\nclass TypeDBExample:\n\n    def typedb_example():\n        # Open a driver connection. The connection will be automatically closed on the \"with\" block exit\n        with TypeDB.cloud_driver(TypeDB.DEFAULT_ADDRESS, Credentials(\"admin\", \"password\"), DriverOptions()) as driver:\n            # Create a database\n            driver.databases.create(\"typedb\")\n            database = driver.databases.get(\"typedb\")\n\n            # Use \"try\" blocks to catch driver exceptions\n            try:\n                # Open transactions of 3 types\n                tx = driver.transaction(database.name, TransactionType.READ)\n\n                # Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception\n                result_promise = tx.query(\"define entity i-cannot-be-defined-in-read-transactions;\")\n\n                print(\"The result is still promised, so it needs resolving even in case of errors!\")\n                result_promise.resolve()\n            except TypeDBDriverException as expected_exception:\n                print(f\"Once the query's promise is resolved, the exception is revealed: {expected_exception}\")\n            finally:\n                # Don't forget to close the transaction!\n                tx.close()\n\n            # Open a schema transaction to make schema changes\n            # Use \"with\" blocks to forget about \"close\" operations (similarly to connections)\n            with driver.transaction(database.name, TransactionType.SCHEMA) as tx:\n                define_query = \"\"\"\n                define \n                  entity person, owns name, owns age; \n                  attribute name, value string;\n                  attribute age, value integer;\n                \"\"\"\n                answer = tx.query(define_query).resolve()\n                if answer.is_ok():\n                    print(f\"OK results do not give any extra interesting information, but they mean that the query \"\n                          f\"is successfully executed!\")\n\n                # Commit automatically closes the transaction. It can still be safely called inside \"with\" blocks\n                tx.commit()\n\n            # Open a read transaction to safely read anything without database modifications\n            with driver.transaction(database.name, TransactionType.READ) as tx:\n                answer = tx.query(\"match entity $x;\").resolve()\n\n                # Collect concept rows that represent the answer as a table\n                rows = list(answer.as_concept_rows())\n                row = rows[0]\n\n                # Collect column names to get concepts by index if the variable names are lost\n                header = list(row.column_names())\n\n                column_name = header[0]\n\n                # Get concept by the variable name (column name)\n                concept_by_name = row.get(column_name)\n\n                # Get concept by the header's index\n                concept_by_index = row.get_index(0)\n\n                print(f\"Getting concepts by variable names ({concept_by_name.get_label()}) and \"\n                      f\"indexes ({concept_by_index.get_label()}) is equally correct. \")\n\n                # Check if it's an entity type before the conversion\n                if concept_by_name.is_entity_type():\n                    print(f\"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' \"\n                          f\"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')\")\n\n                # Continue querying in the same transaction if needed\n                answer = tx.query(\"match attribute $a;\").resolve()\n\n                # Concept rows can be used as any other iterator\n                rows = [row for row in answer.as_concept_rows()]\n\n                for row in rows:\n                    # Same for column names\n                    column_names_iter = row.column_names()\n                    column_name = next(column_names_iter)\n\n                    concept_by_name = row.get(column_name)\n\n                    # Check if it's an attribute type before the conversion\n                    if concept_by_name.is_attribute_type():\n                        attribute_type = concept_by_name.as_attribute_type()\n                        print(f\"Defined attribute type's label: '{attribute_type.get_label()}', \"\n                              f\"value type: '{attribute_type.try_get_value_type()}'\")\n\n\n                    print(f\"It is also possible to just print the concept itself: '{concept_by_name}'\")\n\n            # Open a write transaction to insert data\n            with driver.transaction(database.name, TransactionType.WRITE) as tx:\n                insert_query = \"insert $z isa person, has age 10; $x isa person, has age 20, has name \\\"John\\\";\"\n                answer = tx.query(insert_query).resolve()\n\n                # Insert queries also return concept rows\n                rows = list(answer.as_concept_rows())\n                row = rows[0]\n\n                for column_name in row.column_names():\n                    inserted_concept = row.get(column_name)\n                    print(f\"Successfully inserted ${column_name}: {inserted_concept}\")\n                    if inserted_concept.is_entity():\n                        print(\"This time, it's an entity, not a type!\")\n\n                # It is possible to ask for the column names again\n                header = [name for name in row.column_names()]\n\n                x = row.get_index(header.index(\"x\"))\n                print(\n                    \"As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. \")\n                if x.is_entity():\n                    print(f\"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}\")\n\n                # Do not forget to commit if the changes should be persisted\n                tx.commit()\n\n            # Open another write transaction to try inserting even more data\n            with driver.transaction(database.name, TransactionType.WRITE) as tx:\n                # When loading a large dataset, it's often better not to resolve every query's promise immediately.\n                # Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,\n                # just call `commit`, which will wait for all ongoing operations to finish before executing.\n                queries = [\"insert $a isa person, has name \\\"Alice\\\";\", \"insert $b isa person, has name \\\"Bob\\\";\"]\n                for query in queries:\n                    tx.query(query)\n                tx.commit()\n\n            with driver.transaction(database.name, TransactionType.WRITE) as tx:\n                # Commit will still fail if at least one of the queries produce an error.\n                queries = [\"insert $c isa not-person, has name \\\"Chris\\\";\", \"insert $d isa person, has name \\\"David\\\";\"]\n                promises = []\n                for query in queries:\n                    promises.append(tx.query(query))\n\n                try:\n                    tx.commit()\n                    assert False, \"TypeDBDriverException is expected\"\n                except TypeDBDriverException as expected_exception:\n                    print(f\"Commit result will contain the unresolved query's error: {expected_exception}\")\n\n            # Open a read transaction to verify that the previously inserted data is saved\n            with driver.transaction(database.name, TransactionType.READ) as tx:\n                # A match query can be used for concept row outputs\n                var = \"x\"\n                answer = tx.query(f\"match ${var} isa person;\").resolve()\n\n                # Simple match queries always return concept rows\n                count = 0\n                for row in answer.as_concept_rows():\n                    x = row.get(var)\n                    x_type = x.as_entity().get_type().as_entity_type()\n                    count += 1\n                    print(f\"Found a person {x} of type {x_type}\")\n                print(f\"Total persons found: {count}\")\n\n                # A fetch query can be used for concept document outputs with flexible structure\n                fetch_query = \"\"\"\n                match\n                  $x isa! person, has $a;\n                  $a isa! $t;\n                fetch {\n                  \"single attribute type\": $t,\n                  \"single attribute\": $a,\n                  \"all attributes\": { $x.* },\n                };\n                \"\"\"\n                answer = tx.query(fetch_query).resolve()\n\n                # Fetch queries always return concept documents\n                count = 0\n                for document in answer.as_concept_documents():\n                    count += 1\n                    print(f\"Fetched a document: {document}.\")\n                    print(f\"This document contains an attribute of type: {document['single attribute type']['label']}\")\n                print(f\"Total documents fetched: {count}\")\n\n        print(\"More examples can be found in the API reference and the documentation.\\nWelcome to TypeDB!\")\n```\n\n<!-- CLOUD_EXAMPLE_END_MARKER -->\n\n### TypeDB CE (Core driver)\n\n<!-- CORE_EXAMPLE_START_MARKER -->\n\n```py\nfrom typedb.driver import *\n\n\nclass TypeDBExample:\n\n    def typedb_example():\n        # Open a driver connection. The connection will be automatically closed on the \"with\" block exit\n        with TypeDB.core_driver(TypeDB.DEFAULT_ADDRESS, Credentials(\"admin\", \"password\"), DriverOptions()) as driver:\n            # Create a database\n            driver.databases.create(\"typedb\")\n            database = driver.databases.get(\"typedb\")\n\n            # Use \"try\" blocks to catch driver exceptions\n            try:\n                # Open transactions of 3 types\n                tx = driver.transaction(database.name, TransactionType.READ)\n\n                # Execute any TypeDB query using TypeQL. Wrong queries are rejected with an explicit exception\n                result_promise = tx.query(\"define entity i-cannot-be-defined-in-read-transactions;\")\n\n                print(\"The result is still promised, so it needs resolving even in case of errors!\")\n                result_promise.resolve()\n            except TypeDBDriverException as expected_exception:\n                print(f\"Once the query's promise is resolved, the exception is revealed: {expected_exception}\")\n            finally:\n                # Don't forget to close the transaction!\n                tx.close()\n\n            # Open a schema transaction to make schema changes\n            # Use \"with\" blocks to forget about \"close\" operations (similarly to connections)\n            with driver.transaction(database.name, TransactionType.SCHEMA) as tx:\n                define_query = \"\"\"\n                define \n                  entity person, owns name, owns age; \n                  attribute name, value string;\n                  attribute age, value integer;\n                \"\"\"\n                answer = tx.query(define_query).resolve()\n                if answer.is_ok():\n                    print(f\"OK results do not give any extra interesting information, but they mean that the query \"\n                          f\"is successfully executed!\")\n\n                # Commit automatically closes the transaction. It can still be safely called inside \"with\" blocks\n                tx.commit()\n\n            # Open a read transaction to safely read anything without database modifications\n            with driver.transaction(database.name, TransactionType.READ) as tx:\n                answer = tx.query(\"match entity $x;\").resolve()\n\n                # Collect concept rows that represent the answer as a table\n                rows = list(answer.as_concept_rows())\n                row = rows[0]\n\n                # Collect column names to get concepts by index if the variable names are lost\n                header = list(row.column_names())\n\n                column_name = header[0]\n\n                # Get concept by the variable name (column name)\n                concept_by_name = row.get(column_name)\n\n                # Get concept by the header's index\n                concept_by_index = row.get_index(0)\n\n                print(f\"Getting concepts by variable names ({concept_by_name.get_label()}) and \"\n                      f\"indexes ({concept_by_index.get_label()}) is equally correct. \")\n\n                # Check if it's an entity type before the conversion\n                if concept_by_name.is_entity_type():\n                    print(f\"Both represent the defined entity type: '{concept_by_name.as_entity_type().get_label()}' \"\n                          f\"(in case of a doubt: '{concept_by_index.as_entity_type().get_label()}')\")\n\n                # Continue querying in the same transaction if needed\n                answer = tx.query(\"match attribute $a;\").resolve()\n\n                # Concept rows can be used as any other iterator\n                rows = [row for row in answer.as_concept_rows()]\n\n                for row in rows:\n                    # Same for column names\n                    column_names_iter = row.column_names()\n                    column_name = next(column_names_iter)\n\n                    concept_by_name = row.get(column_name)\n\n                    # Check if it's an attribute type before the conversion\n                    if concept_by_name.is_attribute_type():\n                        attribute_type = concept_by_name.as_attribute_type()\n                        print(f\"Defined attribute type's label: '{attribute_type.get_label()}', \"\n                              f\"value type: '{attribute_type.try_get_value_type()}'\")\n\n\n                    print(f\"It is also possible to just print the concept itself: '{concept_by_name}'\")\n\n            # Open a write transaction to insert data\n            with driver.transaction(database.name, TransactionType.WRITE) as tx:\n                insert_query = \"insert $z isa person, has age 10; $x isa person, has age 20, has name \\\"John\\\";\"\n                answer = tx.query(insert_query).resolve()\n\n                # Insert queries also return concept rows\n                rows = list(answer.as_concept_rows())\n                row = rows[0]\n\n                for column_name in row.column_names():\n                    inserted_concept = row.get(column_name)\n                    print(f\"Successfully inserted ${column_name}: {inserted_concept}\")\n                    if inserted_concept.is_entity():\n                        print(\"This time, it's an entity, not a type!\")\n\n                # It is possible to ask for the column names again\n                header = [name for name in row.column_names()]\n\n                x = row.get_index(header.index(\"x\"))\n                print(\n                    \"As we expect an entity instance, we can try to get its IID (unique identification): {x.try_get_iid()}. \")\n                if x.is_entity():\n                    print(f\"It can also be retrieved directly and safely after a cast: {x.as_entity().get_iid()}\")\n\n                # Do not forget to commit if the changes should be persisted\n                tx.commit()\n\n            # Open another write transaction to try inserting even more data\n            with driver.transaction(database.name, TransactionType.WRITE) as tx:\n                # When loading a large dataset, it's often better not to resolve every query's promise immediately.\n                # Instead, collect promises and handle them later. Alternatively, if a commit is expected in the end,\n                # just call `commit`, which will wait for all ongoing operations to finish before executing.\n                queries = [\"insert $a isa person, has name \\\"Alice\\\";\", \"insert $b isa person, has name \\\"Bob\\\";\"]\n                for query in queries:\n                    tx.query(query)\n                tx.commit()\n\n            with driver.transaction(database.name, TransactionType.WRITE) as tx:\n                # Commit will still fail if at least one of the queries produce an error.\n                queries = [\"insert $c isa not-person, has name \\\"Chris\\\";\", \"insert $d isa person, has name \\\"David\\\";\"]\n                promises = []\n                for query in queries:\n                    promises.append(tx.query(query))\n\n                try:\n                    tx.commit()\n                    assert False, \"TypeDBDriverException is expected\"\n                except TypeDBDriverException as expected_exception:\n                    print(f\"Commit result will contain the unresolved query's error: {expected_exception}\")\n\n            # Open a read transaction to verify that the previously inserted data is saved\n            with driver.transaction(database.name, TransactionType.READ) as tx:\n                # A match query can be used for concept row outputs\n                var = \"x\"\n                answer = tx.query(f\"match ${var} isa person;\").resolve()\n\n                # Simple match queries always return concept rows\n                count = 0\n                for row in answer.as_concept_rows():\n                    x = row.get(var)\n                    x_type = x.as_entity().get_type().as_entity_type()\n                    count += 1\n                    print(f\"Found a person {x} of type {x_type}\")\n                print(f\"Total persons found: {count}\")\n\n                # A fetch query can be used for concept document outputs with flexible structure\n                fetch_query = \"\"\"\n                match\n                  $x isa! person, has $a;\n                  $a isa! $t;\n                fetch {\n                  \"single attribute type\": $t,\n                  \"single attribute\": $a,\n                  \"all attributes\": { $x.* },\n                };\n                \"\"\"\n                answer = tx.query(fetch_query).resolve()\n\n                # Fetch queries always return concept documents\n                count = 0\n                for document in answer.as_concept_documents():\n                    count += 1\n                    print(f\"Fetched a document: {document}.\")\n                    print(f\"This document contains an attribute of type: {document['single attribute type']['label']}\")\n                print(f\"Total documents fetched: {count}\")\n\n        print(\"More examples can be found in the API reference and the documentation.\\nWelcome to TypeDB!\")\n```\n\n<!-- CORE_EXAMPLE_END_MARKER -->\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "TypeDB Driver for Python",
    "version": "3.0.5",
    "project_urls": {
        "Homepage": "https://github.com/typedb/typedb-driver-python/"
    },
    "split_keywords": [
        "typedb",
        "database",
        "graph",
        "knowledgebase",
        "knowledge-engineering"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bed85615e80502ab8ccd2b187ee19eb9c9ee004ed331d3ba8db85b1bbf74bb8b",
                "md5": "e9642aa124dd8afc25c901f328711243",
                "sha256": "e65981711cf4b21c92fad4e928f4a4ddf804b348671d5808fb0fffc76e24b37d"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py310-none-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "e9642aa124dd8afc25c901f328711243",
            "packagetype": "bdist_wheel",
            "python_version": "py310",
            "requires_python": ">0",
            "size": 5001323,
            "upload_time": "2025-01-31T16:22:19",
            "upload_time_iso_8601": "2025-01-31T16:22:19.453617Z",
            "url": "https://files.pythonhosted.org/packages/be/d8/5615e80502ab8ccd2b187ee19eb9c9ee004ed331d3ba8db85b1bbf74bb8b/typedb_driver-3.0.5-py310-none-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0008c504eecf1a2e7589d4da91ea8048a0a8f5fb9caa10f3823a1c562269eaaf",
                "md5": "eb4a8a4f9cfc9bdf973ab8e67abb0a17",
                "sha256": "bf7af10cc91a0926c78a6caedd2d0493308c2931dd558203c46dca5b5feebc08"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py310-none-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "eb4a8a4f9cfc9bdf973ab8e67abb0a17",
            "packagetype": "bdist_wheel",
            "python_version": "py310",
            "requires_python": ">0",
            "size": 5090634,
            "upload_time": "2025-01-31T16:28:10",
            "upload_time_iso_8601": "2025-01-31T16:28:10.076584Z",
            "url": "https://files.pythonhosted.org/packages/00/08/c504eecf1a2e7589d4da91ea8048a0a8f5fb9caa10f3823a1c562269eaaf/typedb_driver-3.0.5-py310-none-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "76d07468aca69c30494799ddaa02da294d57a4b8705ccc4354389a5599aade21",
                "md5": "9c98b30ef0e5435784dd656b3273552a",
                "sha256": "e6bf26866b917c906c1d930ae05716d6803704a843a53ee0dc71e50c6e9707a0"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py310-none-manylinux_2_17_aarch64.whl",
            "has_sig": false,
            "md5_digest": "9c98b30ef0e5435784dd656b3273552a",
            "packagetype": "bdist_wheel",
            "python_version": "py310",
            "requires_python": ">0",
            "size": 6057268,
            "upload_time": "2025-01-31T16:29:08",
            "upload_time_iso_8601": "2025-01-31T16:29:08.191987Z",
            "url": "https://files.pythonhosted.org/packages/76/d0/7468aca69c30494799ddaa02da294d57a4b8705ccc4354389a5599aade21/typedb_driver-3.0.5-py310-none-manylinux_2_17_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "961884e8cd0259656d06b5fc528ee1ed8a0546ec2f414941aadf5249c22f06de",
                "md5": "54f0a31a392bc725b7f90f96d67df4d9",
                "sha256": "34f6331f7aed7866056d3af25fd4a444423ade05f96f066101e9228ef73d7137"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py310-none-manylinux_2_17_x86_64.whl",
            "has_sig": false,
            "md5_digest": "54f0a31a392bc725b7f90f96d67df4d9",
            "packagetype": "bdist_wheel",
            "python_version": "py310",
            "requires_python": ">0",
            "size": 6125385,
            "upload_time": "2025-01-31T16:25:12",
            "upload_time_iso_8601": "2025-01-31T16:25:12.866959Z",
            "url": "https://files.pythonhosted.org/packages/96/18/84e8cd0259656d06b5fc528ee1ed8a0546ec2f414941aadf5249c22f06de/typedb_driver-3.0.5-py310-none-manylinux_2_17_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "19ad1dd2eb025746e31436f03b6efa61102d6126e5d4e5a891ea1e5720efd9c1",
                "md5": "43b95bd59207e038303bfc8b169fd73d",
                "sha256": "7f6c2b4f5f8619c61f5dc7b118a34f2906a6a60885220da1422c099c4ce9411b"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py310-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "43b95bd59207e038303bfc8b169fd73d",
            "packagetype": "bdist_wheel",
            "python_version": "py310",
            "requires_python": ">0",
            "size": 2906226,
            "upload_time": "2025-01-31T16:26:46",
            "upload_time_iso_8601": "2025-01-31T16:26:46.684937Z",
            "url": "https://files.pythonhosted.org/packages/19/ad/1dd2eb025746e31436f03b6efa61102d6126e5d4e5a891ea1e5720efd9c1/typedb_driver-3.0.5-py310-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "60f5e893ea23bb3725b18c03d9116281f7dbf9d2055bafdbfca74c74c3f3bccd",
                "md5": "f0d18f99f7e7e20f1a415d4dbc518e4e",
                "sha256": "a5118316c8a1c04caa01093ec9afab7b687faef7952696ebcfe7c83b77b762f6"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py311-none-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "f0d18f99f7e7e20f1a415d4dbc518e4e",
            "packagetype": "bdist_wheel",
            "python_version": "py311",
            "requires_python": ">0",
            "size": 5001317,
            "upload_time": "2025-01-31T16:22:30",
            "upload_time_iso_8601": "2025-01-31T16:22:30.175603Z",
            "url": "https://files.pythonhosted.org/packages/60/f5/e893ea23bb3725b18c03d9116281f7dbf9d2055bafdbfca74c74c3f3bccd/typedb_driver-3.0.5-py311-none-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "76df68f4a8386092e309cbb72dc8a4f91914b86af2e2876085c2552f1dd28656",
                "md5": "4fd7c70c88d5d69a0aa6c8c3faa53d4b",
                "sha256": "61f4692aa9fbdc6d15ebe1a804e2b0adda91a8dc10cd99c76a5ae53c9547030b"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py311-none-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4fd7c70c88d5d69a0aa6c8c3faa53d4b",
            "packagetype": "bdist_wheel",
            "python_version": "py311",
            "requires_python": ">0",
            "size": 5090638,
            "upload_time": "2025-01-31T16:28:32",
            "upload_time_iso_8601": "2025-01-31T16:28:32.656211Z",
            "url": "https://files.pythonhosted.org/packages/76/df/68f4a8386092e309cbb72dc8a4f91914b86af2e2876085c2552f1dd28656/typedb_driver-3.0.5-py311-none-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0e5ae15cc083a47da5e57a9f1a5dc5e21588f1dab63790a124cecd6bcdc20d47",
                "md5": "35dcac3d3f1a94506fc3f68ec54cba16",
                "sha256": "cc84724154ce0d3c044e96815b3e3cc18efc006c4231cb052595325616d88839"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py311-none-manylinux_2_17_aarch64.whl",
            "has_sig": false,
            "md5_digest": "35dcac3d3f1a94506fc3f68ec54cba16",
            "packagetype": "bdist_wheel",
            "python_version": "py311",
            "requires_python": ">0",
            "size": 6056948,
            "upload_time": "2025-01-31T16:29:29",
            "upload_time_iso_8601": "2025-01-31T16:29:29.646277Z",
            "url": "https://files.pythonhosted.org/packages/0e/5a/e15cc083a47da5e57a9f1a5dc5e21588f1dab63790a124cecd6bcdc20d47/typedb_driver-3.0.5-py311-none-manylinux_2_17_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e5ad6bece99fd6355ce25de8840cead024b74841afb261d25e3f23594dc26f97",
                "md5": "6d534ee0ad4682ff539d9e24b3eb98b8",
                "sha256": "711b1aa0d9cdb296eea2b199757567d3d213f52d81ea0593918091613ab3f9ff"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py311-none-manylinux_2_17_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6d534ee0ad4682ff539d9e24b3eb98b8",
            "packagetype": "bdist_wheel",
            "python_version": "py311",
            "requires_python": ">0",
            "size": 6125551,
            "upload_time": "2025-01-31T16:25:38",
            "upload_time_iso_8601": "2025-01-31T16:25:38.565798Z",
            "url": "https://files.pythonhosted.org/packages/e5/ad/6bece99fd6355ce25de8840cead024b74841afb261d25e3f23594dc26f97/typedb_driver-3.0.5-py311-none-manylinux_2_17_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a593da3ecc0a655d586a417142e9c0472dc05f9ba18d88d26bf02330b1f5e408",
                "md5": "bec460dd09f1c52184c59d16eaed65bd",
                "sha256": "6fe89f32c721ba78ec601654ba2f470ad46d6f43f8f9493713acaec02b4f558f"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py311-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "bec460dd09f1c52184c59d16eaed65bd",
            "packagetype": "bdist_wheel",
            "python_version": "py311",
            "requires_python": ">0",
            "size": 2906315,
            "upload_time": "2025-01-31T16:28:13",
            "upload_time_iso_8601": "2025-01-31T16:28:13.016313Z",
            "url": "https://files.pythonhosted.org/packages/a5/93/da3ecc0a655d586a417142e9c0472dc05f9ba18d88d26bf02330b1f5e408/typedb_driver-3.0.5-py311-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "acf60da4c6a0b7efeadb3801f8050861e4d98655c037acc8a4fa62814364ab34",
                "md5": "2e9274ce38bf7ff3e49b8e15ff83000a",
                "sha256": "fbcbf66080b28cf117da12efba26bcc9cb1c7e78cb6ae3a89a3fb68d5f91bc2e"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py312-none-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "2e9274ce38bf7ff3e49b8e15ff83000a",
            "packagetype": "bdist_wheel",
            "python_version": "py312",
            "requires_python": ">0",
            "size": 5001776,
            "upload_time": "2025-01-31T16:22:43",
            "upload_time_iso_8601": "2025-01-31T16:22:43.251211Z",
            "url": "https://files.pythonhosted.org/packages/ac/f6/0da4c6a0b7efeadb3801f8050861e4d98655c037acc8a4fa62814364ab34/typedb_driver-3.0.5-py312-none-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4c058bcba5129693a9feab01c8e734c77401acc4a11c2b8148872d04000c3188",
                "md5": "e4da1952e7e6773e8641438fc9b4c1c3",
                "sha256": "03a3d768415fd2d52f7a148c91ceb3bd0d3dadee431c919d7768052cfe121f2b"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py312-none-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e4da1952e7e6773e8641438fc9b4c1c3",
            "packagetype": "bdist_wheel",
            "python_version": "py312",
            "requires_python": ">0",
            "size": 5091341,
            "upload_time": "2025-01-31T16:28:49",
            "upload_time_iso_8601": "2025-01-31T16:28:49.997397Z",
            "url": "https://files.pythonhosted.org/packages/4c/05/8bcba5129693a9feab01c8e734c77401acc4a11c2b8148872d04000c3188/typedb_driver-3.0.5-py312-none-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "12e1523255256740101ca0e901579dd4914a23d5f51a705da590fda83f78066c",
                "md5": "c3a04d2c8931aa5a4fdfb20c9f1f2ae1",
                "sha256": "9dd89bf34d254bf5d73a86ee423b8c524578b58facdd31e760bce1f5581aa616"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py312-none-manylinux_2_17_aarch64.whl",
            "has_sig": false,
            "md5_digest": "c3a04d2c8931aa5a4fdfb20c9f1f2ae1",
            "packagetype": "bdist_wheel",
            "python_version": "py312",
            "requires_python": ">0",
            "size": 6057324,
            "upload_time": "2025-01-31T16:29:51",
            "upload_time_iso_8601": "2025-01-31T16:29:51.824370Z",
            "url": "https://files.pythonhosted.org/packages/12/e1/523255256740101ca0e901579dd4914a23d5f51a705da590fda83f78066c/typedb_driver-3.0.5-py312-none-manylinux_2_17_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e971cdd422c28ee33bd4d3add6095643f6700a7ce11ce86caf85477bb9eef889",
                "md5": "7a2793acc4998dfdd4ca77f0682fd204",
                "sha256": "f670aaf773a23a2801f5b9a8f1ccc6b686cdeb667fada021d1c100c5867ef5d9"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py312-none-manylinux_2_17_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7a2793acc4998dfdd4ca77f0682fd204",
            "packagetype": "bdist_wheel",
            "python_version": "py312",
            "requires_python": ">0",
            "size": 6125747,
            "upload_time": "2025-01-31T16:26:05",
            "upload_time_iso_8601": "2025-01-31T16:26:05.689813Z",
            "url": "https://files.pythonhosted.org/packages/e9/71/cdd422c28ee33bd4d3add6095643f6700a7ce11ce86caf85477bb9eef889/typedb_driver-3.0.5-py312-none-manylinux_2_17_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5c80d425ae46b2fcb32d5061175793264d61ff9cd6edd96cfd498aa64ebbf60e",
                "md5": "2d34941c7382c274be8a52706e132a61",
                "sha256": "17c42113def0cd3532dde1871368c3810e144893ccee28616c137e986b211d9e"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py312-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2d34941c7382c274be8a52706e132a61",
            "packagetype": "bdist_wheel",
            "python_version": "py312",
            "requires_python": ">0",
            "size": 2906024,
            "upload_time": "2025-01-31T16:29:08",
            "upload_time_iso_8601": "2025-01-31T16:29:08.031973Z",
            "url": "https://files.pythonhosted.org/packages/5c/80/d425ae46b2fcb32d5061175793264d61ff9cd6edd96cfd498aa64ebbf60e/typedb_driver-3.0.5-py312-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "71ecc72fbb5af90a2bb50af4cacab6ce8c5b851e6b1684016a4f3c133c66cdbc",
                "md5": "5a23eac3623eb940b83cf2918414d093",
                "sha256": "76e313ccbf92969cb2029dbf1d5d7d382615d32410a5365a611e639bfde501b1"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py39-none-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "5a23eac3623eb940b83cf2918414d093",
            "packagetype": "bdist_wheel",
            "python_version": "py39",
            "requires_python": ">0",
            "size": 5000944,
            "upload_time": "2025-01-31T16:22:08",
            "upload_time_iso_8601": "2025-01-31T16:22:08.123857Z",
            "url": "https://files.pythonhosted.org/packages/71/ec/c72fbb5af90a2bb50af4cacab6ce8c5b851e6b1684016a4f3c133c66cdbc/typedb_driver-3.0.5-py39-none-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8af4b67f36fb507effcb0582d5ffffe62383fd46d75b265ac8a521bf19a01a3a",
                "md5": "6a2ed35a5ef219a51ea48a8b8aeec391",
                "sha256": "9574adb3ae07c8e25d9dd62085591dfb6c75c781ccffb50c7ef517ea38c4628a"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py39-none-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6a2ed35a5ef219a51ea48a8b8aeec391",
            "packagetype": "bdist_wheel",
            "python_version": "py39",
            "requires_python": ">0",
            "size": 5090983,
            "upload_time": "2025-01-31T16:27:44",
            "upload_time_iso_8601": "2025-01-31T16:27:44.274374Z",
            "url": "https://files.pythonhosted.org/packages/8a/f4/b67f36fb507effcb0582d5ffffe62383fd46d75b265ac8a521bf19a01a3a/typedb_driver-3.0.5-py39-none-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5eaaecb61a613b0a95a929fd7dbb22d3f3de32c7f4b9641fbcb53589188606f3",
                "md5": "b4ca23d5f19a172b13d91b8c09a9d59f",
                "sha256": "ec07c0154c477feac78bd885f0f9e1990f01229ee2ed4b0bad2086947d7a7bdf"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py39-none-manylinux_2_17_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b4ca23d5f19a172b13d91b8c09a9d59f",
            "packagetype": "bdist_wheel",
            "python_version": "py39",
            "requires_python": ">0",
            "size": 6056988,
            "upload_time": "2025-01-31T16:28:45",
            "upload_time_iso_8601": "2025-01-31T16:28:45.132543Z",
            "url": "https://files.pythonhosted.org/packages/5e/aa/ecb61a613b0a95a929fd7dbb22d3f3de32c7f4b9641fbcb53589188606f3/typedb_driver-3.0.5-py39-none-manylinux_2_17_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "133b7fde5eb96bff9a76c0fcd7c2cf010301b25a562d62e3ad7057e80b95c8f8",
                "md5": "c576ee53b7f0b95cc2cdbc0123d0cc6d",
                "sha256": "85d8e095857a5fed9ecf8087de257639b569e4fac5b733f197730122710f768d"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py39-none-manylinux_2_17_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c576ee53b7f0b95cc2cdbc0123d0cc6d",
            "packagetype": "bdist_wheel",
            "python_version": "py39",
            "requires_python": ">0",
            "size": 6125399,
            "upload_time": "2025-01-31T16:24:46",
            "upload_time_iso_8601": "2025-01-31T16:24:46.580509Z",
            "url": "https://files.pythonhosted.org/packages/13/3b/7fde5eb96bff9a76c0fcd7c2cf010301b25a562d62e3ad7057e80b95c8f8/typedb_driver-3.0.5-py39-none-manylinux_2_17_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c7a97c51658f8621e42ef4ce7f4a176d963143349fe1a3ac2d48a2ae20972db8",
                "md5": "24a13242dfcb232a3dba3f4eb06cd15e",
                "sha256": "aae1ede70973628202769b4d4d88e1f54b1c6ff0e6133c87005cafc4c7254c03"
            },
            "downloads": -1,
            "filename": "typedb_driver-3.0.5-py39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "24a13242dfcb232a3dba3f4eb06cd15e",
            "packagetype": "bdist_wheel",
            "python_version": "py39",
            "requires_python": ">0",
            "size": 2906230,
            "upload_time": "2025-01-31T16:25:15",
            "upload_time_iso_8601": "2025-01-31T16:25:15.640226Z",
            "url": "https://files.pythonhosted.org/packages/c7/a9/7c51658f8621e42ef4ce7f4a176d963143349fe1a3ac2d48a2ae20972db8/typedb_driver-3.0.5-py39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-01-31 16:22:19",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "typedb",
    "github_project": "typedb-driver-python",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "parse",
            "specs": [
                [
                    "==",
                    "1.18.0"
                ]
            ]
        }
    ],
    "lcname": "typedb-driver"
}
        
Elapsed time: 0.88560s