This is the v1.0 release for the `edgedb-python` client library. It is accompanied by the introduction of a new module `edgedb.codegen` which can be executed to generate code from `.edgeql` files.
Breaking Changes
Query Result Type Changes
366
1. In edgedb-python 1.0, we dropped many custom data structure implementations, and replaced them with Python builtins:
| Impl Dropped | Replacement | Breaking Changes |
|----------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| `edgedb.Tuple` | `tuple` | `weakref.ref()` will stop working on tuples |
| `edgedb.Set` | `list` | * Immutability is broken<br>* `weakref.ref()` will stop working on sets<br>* `hash()` will stop working on sets<br>* `repr()` produces different results |
| `edgedb.Array` | `list` | * Immutability is broken<br>* `weakref.ref()` will stop working on lists<br>* `hash()` will stop working on lists |
While the implementations are dropped, the reference name is still there, like `edgedb.Tuple` is simply an alias of the builtin `tuple`.
2. `edgedb.NamedTuple` is reimplemented.
* **[Breaking Change]** `weakref.ref()` will stop working on named tuples.
* `edgedb.NamedTuple` is now a subclass of Python builtin `tuple`.
* Before named tuple instances are created, a transient heap type `DerivedNamedTuple` will be created first as a subclass of `edgedb.NamedTuple`, which is then used to create instances with naming data.
* `DerivedNamedTuple` classes are usually cached in codecs, and garbage-collected when all its references are cleared.
3. `edgedb.EnumValue` is reimplemented.
* **[Breaking Change]** The result of `repr()` is slightly changed to have the `edgedb.` prefix.
* `edgedb.EnumValue` is now a subclass of Python builtin `enum.Enum`.
* Before enum values are created, a transient heap type `DerivedEnumValue` will be created first as a subclass of `edgedb.EnumValue`, which is then used to create instances with full enumeration. Enum member names are simply upper case strings of corresponding values.
* `DerivedEnumValue` classes are usually cached in codecs, and garbage-collected when all its references are cleared.
4. `edgedb.Object` changes.
* **[Breaking Change]** The custom implementation of `__hash__()` on `edgedb.Object` is dropped, now `hash()` simply returns a hash on the memory address.
* **[Breaking Change]** The custom implementation of rich comparion is dropped, that means `<`, `>`, `<=`, `>=` will stop working on `edgedb.Object` instances, and `==` is now equivalent to `is` for `edgedb.Object` instances.
* `edgedb.Object` instances will now yield `True` for `dataclasses.is_dataclass()` check.
* `edgedb.Object` instances can now be used in `dataclasses.as_dict()` to recursively generate a dict containing all properties and links (excluding link properties).
5. The performance impact is minimal. We are still using the most efficient C-API and C/Cython implementations to offer query results,
No more Python 3.6
As Python 3.6 is no longer supported itself 10 months ago, edgedb-python is also dropping support for Python 3.6.
edgedb-python 1.0 now supprots only Pyhton 3.7 to Python 3.11.
New Features
Code generation
363
Now you can create one or more `.edgeql` files in your EdgeDB project directory, and run:
console
$ python -m edgedb.codegen
or alternatively:
console
$ edgedb-py
This command will search through the EdgeDB project directory and generate typesafe query code for the `.edgeql` files.
Access of link properties
379
`edgedb.Link` and `edgedb.LinkSet` types, as well as the way to access them, are deprecated in edgedb-python 1.0 and will be dropped in 2.0. For example, with a given schema:
type Person {
multi link friends -> Person {
property strength -> float32;
}
}
Expression like `person["friends"]` will now emit a `DeprecationWarning`. This deprecates the old way to access link properties like `person["friends"][0].strength`. Instead, a new way is introduced: you should now use `person.friends[0]["strength"]`.
Detail Changelog
Changes
* Implement dataclass for EdgeObject (359) (by fantix in dfb8c8b0 for 359)
* Redo edgedb basic types to inherit from builtin types (366) (by fantix in b11b9917 for 366)
* Officially drop 3.6 support (373) (by msullivan in 7b76bc73 for 373)
* Support Python 3.11 (375) (by msullivan in 04b0da2a for 375)
* Codegen with the describe_query() API (363) (by fantix in 361221df for 363)
* Add codegen docs (380) (by colinhacks in 23dd42e6 for 380)
* Use typing_extension.Literal in codegen for Python 3.7 (by fantix in 6d0d6abc)
* Add __all__ to edgedb/__init__.py (by fmoor in d3ef6d93)
Fixes
* Improve duration parsing (by fmoor in 241c80d8)
* Tweak wording in query_single() error messages (369) (by msullivan in e24bb538 for 369)
* Fix flake tests on python3.7 (371) (by msullivan in 583e1cbd for 371)
* Don't reject tuple arguments on the client side (370) (by msullivan in 09c950fd for 370)
* Correct edgedb.Client.close() timeout behavior (by fantix in 33a912c1)
* Ping first if conn is idle for too long (365) (by fantix in 99cf78a0 for 365)
* Use -prefixed keys in object codec for link properties (384) (by fantix in 68480f92 for 377)
Deprecations
* Deprecate object links and simplify link property access (379) (by fantix in 2c5dcc70 for 379)