File: changelog.rst

package info (click to toggle)
python-advanced-alchemy 1.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,424 kB
  • sloc: python: 33,714; makefile: 162; javascript: 123; sh: 4
file content (959 lines) | stat: -rw-r--r-- 30,650 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
:orphan:

1.x Changelog
=============

.. changelog:: 1.6.2
    :date: 2025-08-29

    .. change:: enable loading config from working directory
        :type: feature
        :pr: 527
        :issue: 491

        Correctly allow loading configuration from the current directory

    .. change:: correctly handle lazy attributes on update
        :type: bugfix
        :pr: 533

        Correctly handle `viewownly` and `lazy` loaded relationships during update.

    .. change:: prevent AttributeError when schema_dump receives None values
        :type: bugfix
        :pr: 530

        - `advanced_alchemy/service/typing.py`: Fixed `has_dict_attribute()` function
        - `tests/unit/test_attrs_integration.py`: Added test case for `None` value handling

    .. change:: add warning message when using fallback value for a primary key
        :type: bugfix
        :pr: 529

        - Add warning message when using `uuid` instead of `nanoid`
        - Add warning message when using `uuid4` instead of `uuid6` or `uuid7`

    .. change:: litestar fileobject example
        :type: bugfix
        :pr: 531

        Fix litestar fileobject example

    .. change:: pass Content-Type and metadata to backend storage
        :type: bugfix
        :pr: 528

        - Modified `save_object` and `save_object_async` methods to collect attributes from `FileObject`
        - Pass `content_type` as `"Content-Type"` in the `attributes` parameter
        - Include any custom metadata from `FileObject.metadata`
        - Added proper typing for the attributes dictionary

.. changelog:: 1.6.1
    :date: 2025-08-26

    .. change:: `to_schema` and `attrs` type hint correction
        :type: bugfix
        :pr: 516

        Corrects an issue where the type hint was incorrect when `attrs` or `cattrs` were not installed.

    .. change:: suppress `passlib` caused pytest warnings and other session warnings
        :type: bugfix
        :pr: 518

        Suppress warnings caused by `passlib` during testing.

    .. change:: `IdentityPrimaryKey` correctly generates an `IDENTITY` DDL
        :type: bugfix
        :pr: 523

        Ensure that the `IdentityPrimaryKey` correctly generates `IDENTITY` DDL across multiple database dialects, including PostgreSQL, Oracle, and SQL Server. Update dependencies and add tests to verify the functionality.


.. changelog:: 1.6.0
    :date: 2025-08-18

    .. change:: server side session backend
        :type: feature
        :pr: 429

        Implements a server side session backend using SQLAlchemy. Works with an Async or Sync configuration.

    .. change:: handle relationship data in model_from_dict for service.create()
        :type: bugfix
        :pr: 512

        Fixed regression where service.create() method stopped handling relationship data correctly when passed SQLAlchemy model instances. Changed model_from_dict() in _util.py to use `__mapper__.attrs.keys()` instead of `__mapper__.columns.keys()` to include relationship attributes alongside column attributes.
         - Use `attrs.keys()` to include both columns and relationships
         - Add comprehensive tests for relationship handling in model_from_dict
         - Verify unknown attributes are still ignored


.. changelog:: 1.5.0
    :date: 2025-08-13

    .. change:: correct typing issue in `litestar` example
        :type: bugfix
        :pr: 498

        Fixed typing issue in `Litestar` usage documentation

    .. change:: correctly handle `id_attribute` with `update`
        :type: bugfix
        :pr: 502

        Correctly merge attributes onto existing instance when using `id_attribute` and `update`

    .. change:: gzip and zipped fixture support
        :type: feature
        :pr: 500

        Contains support for automatically extracting and loading data from zipped fixture files

    .. change:: match against complex types
        :type: feature
        :pr: 501

        Correctly handle complex data types for matching fields

    .. change:: `attrs` integration
        :type: feature
        :pr: 503

        Adds `attrs` support into the `ResultConverter` mixin.  This enables `to_schema` and `schema_dump` to natively understand `attrs`.


.. changelog:: 1.4.5
    :date: 2025-06-28

    .. change:: add the DefaultBase class to __all__
        :type: feature
        :pr: 482
        :issue: 481

        Adds [`DefaultBase`](https://github.com/litestar-org/advanced-alchemy/blob/6cc26ef8d53bc04f89a070337f8b0ab07a1bac46/advanced_alchemy/base.py#L517) class to `__all__` to match other public classes in the module.

    .. change:: Update list and count
        :type: bugfix
        :pr: 487

        Minor adjustment to the list and count method


.. changelog:: 1.4.4
    :date: 2025-05-26

    .. change:: support for alembic 1.16 `toml_file` configuration
        :type: bugfix
        :pr: 479

        Updates the AlembicCommand to use named arguments and support Alembic 1.16's new `toml_file` parameter.


.. changelog:: 1.4.3
    :date: 2025-05-12

    .. change:: add __all__ exports for password hashing backends
        :type: feature
        :pr: 471

        This update adds __all__ exports for the Argon2, Passlib, and Pwdlib hashing backends, improving module visibility and usability.

    .. change:: Add identity Mixin for Primary Keys
        :type: feature
        :pr: 473
        :issue: 441

        The sequences based BigInt key offers the most compatibility, but many would prefer to use the Identity column when the database supports it.

        This changes implements a basic Identity primary key mixin

    .. change:: `wrap_exceptions` is re-enabled
        :type: bugfix
        :pr: 475
        :issue: 472

        `wrap_exceptions` is now correctly passed into the exception handler context manager.

        Fixes #472



.. changelog:: 1.4.2
    :date: 2025-05-04

    .. change:: correct type hints for with_for_update to ForUpdateParameter
        :type: bugfix
        :pr: 465

        This change fixes the type hint for the `with_for_update` parameter in the repositories.

    .. change:: BigIntPrimaryKey does not respect schema names
        :type: bugfix
        :pr: 469
        :issue: 466

        BigIntPrimaryKey will now respect schema names.

        Fixes #466


.. changelog:: 1.4.1
    :date: 2025-04-28

    .. change:: raise if filter operator is not in `operators_map`
        :type: bugfix
        :pr: 463
        :issue: 453

        Raise exception if filter operator does not exist in operators_map

        Fixes #453

    .. change:: `uniquify` respects init method override
        :type: bugfix
        :pr: 462

        Passing `uniquify` as an `__init__` argument now works as expected.


.. changelog:: 1.4.0
    :date: 2025-04-27

    .. change:: PasswordHash field type
        :type: feature
        :pr: 452

        Implements a PasswordHash field type with multiple supported backends.

        Includes built-in backends for:
        - `passlib`
        - `argon2`
        - `pwdlib`


.. changelog:: 1.3.2
    :date: 2025-04-25

    .. change:: remove stringified type hint
        :type: bugfix
        :pr: 457

        "De-stringifies" the Filter type hints to prevent runtime type resolutions in some cases

    .. change:: FileObject native Pydantic Core integration
        :type: bugfix
        :pr: 458

        File object will now serialize properly in pydantic.

        More complete FastAPI examples added.


.. changelog:: 1.3.1
    :date: 2025-04-21

    .. change:: updated example `litestar_service.py` model
        :type: bugfix
        :pr: 450
        :issue: 449

        ## fixes #449 relationship updated on models:
        - AuthorModel
        - BookModel

    .. change:: `create_service_provider` supports any configuration now
        :type: bugfix
        :pr: 451

        The Litestar service provider now allows a user to specify the specific dependency key to use for the session.  Previously the factory only worked with the `db_session` key.

    .. change:: update service provider to use dynamic session dependency key
        :type: bugfix
        :pr: 454

        Update the Litestar service provider to use dynamic session dependency key

    .. change:: allows positional args for session
        :type: feature
        :pr: 455

        This change allows for arguments to also be matched when generating a service provider closure.

.. changelog:: 1.3.0
    :date: 2025-04-18

    .. change:: btn ui
        :type: bugfix
        :pr: 446

        Corrects the button UI in the documentation under certain viewport sizes.

    .. change:: add dependency provider
        :type: feature
        :pr: 431

        Add dependency factories for filters.


.. changelog:: 1.2.0
    :date: 2025-04-15

    .. change:: migration generation produces duplicated unique constraints
        :type: bugfix
        :pr: 434
        :issue: 427

        Removes column re-ordering component was incorrectly causing incorrect constraints to be genreated.

        Fixes #427

    .. change:: make `SentinelMixin` compatible with `MappedAsDataclass`
        :type: bugfix
        :pr: 442

        `MappedAsDataclass` is a mixin introduced in SQLAlchemy 2.0. It introduces massive DX improvements to SQLAlchemy by introducing dataclass type validation to SQLAlchemy models. However, this mixin is incompatible with SQLAlchemy's recommended method of implementing a sentinel column as written in their [documentation](https://docs.sqlalchemy.org/en/20/core/connections.html#configuring-sentinel-columns).

        This PR fixes this incompatibility as suggested by the SQLAlchemy maintainer in this [discussion](https://github.com/sqlalchemy/sqlalchemy/discussions/12519#discussioncomment-12804658).

    .. change:: enable standard order by
        :type: feature
        :pr: 438

        Enables the standard `UnaryOperator` order by support in addition to the existing `OrderingPair`

    .. change:: additional filter configuration options
        :type: feature
        :pr: 444

        Implements the following filters as configurable options:
        - NotInCollection
        - Collection

        Search now also accepts a set of strings in addition to a comma delimmited list.


.. changelog:: 1.1.1
    :date: 2025-04-07

    .. change:: fsspec is not installed
        :type: bugfix
        :pr: 432

        Corrects an import issue when `fsspec` and `obstore` are both missing.


.. changelog:: 1.1.0
    :date: 2025-04-06

    .. change:: add stamp command
        :type: feature
        :pr: 428

        Adds the Alembic `stamp` command to the CLI that will stamp the current database state into the migrations directory.

    .. change:: adds an `ExistsFilter` and `NotExists` filter
        :type: feature
        :pr: 336
        :issue: 331

        Implements new `Exists` and `NotExists` filters to more easily apply this type of logic to queries.

        Closes #331

    .. change:: fully migrate to `pytest-databases`
        :type: feature
        :pr: 430

        Migrates all database fixtures to `pytest-database`

    .. change:: file object data type
        :type: feature
        :pr: 291
        :issue: 24

        Implement a file data type that leverages `obstore` or `fsspec`.  Supports any supported FSSpec or Obstore backend it including `sftp`, `gcs`, `s3`, `local`, and more.

    .. change:: Implements a `MultiFilter` type for complex searches
        :type: feature
        :pr: 311

        This PR implements a "Multi-Filter" Filter type.

        It allows:
        - Create a collection of filters from an input
        - Allows filters to be groups with and/or logic


.. changelog:: 1.0.2
    :date: 2025-04-01

    .. change:: prevent forward resolution issues
        :type: bugfix
        :pr: 423

        Removes some stringified representations to help with the forward resolution of `datetime` and `Collection`.

    .. change:: correctly set `uniquify` from `new`
        :type: bugfix
        :pr: 424

        Unquify is now correctly set when passed into the `new`/`init` methods.

        Introduced tests for `sync_tools` utilities, including `maybe_async_`, `maybe_async_context`, `SoonValue`, `TaskGroup`, and others.

        Improves coverage for async and sync function handling, context managers, and value management.



    .. change:: remove accidental litestar import
        :type: bugfix
        :pr: 426

        Remove an incorrect import of `console` from `litestar.cli._utils` and replace it with a correct import from `rich`. This change ensures proper functionality without unnecessary dependencies.


.. changelog:: 1.0.1
    :date: 2025-03-19

    .. change:: properly serialize `Relationship` type hints
        :type: bugfix
        :pr: 422

        Adds `sqlalchemy.orm.Relationship` to the supported type hints for the `SQLAlchemyDTO`


.. changelog:: 1.0.0
    :date: 2025-03-18

    .. change:: remove deprecated packages removed in `v1.0.0`
        :type: misc
        :pr: 419

        Removes deprecated packages and prepares for 1.0 release.

    .. change:: logic correction for window function
        :type: bugfix
        :pr: 421

        Corrects the logic for using a count with a window function.


.. changelog:: 0.34.0
    :date: 2025-03-10

    .. change:: allow custom `not_found` error messages
        :type: feature
        :pr: 417
        :issue: 391

        Enhance the SQLAlchemy exception wrapper to handle NotFoundError with custom error messages and improved error handling. This includes:

        - Adding a 'not_found' key to ErrorMessages type
        - Extending wrap_sqlalchemy_exception to catch and handle NotFoundError
        - Updating default error message templates with a not_found message
        - Adding unit tests for custom NotFoundError handling

    .. change:: Refactor Sanic extension for multi-config support
        :type: feature
        :pr: 415
        :issue: 375

        This commit refactors the Sanic extension for Advanced Alchemy:

        - Refactored configuration handling with support for multiple database configurations
        - Added methods for retrieving async and sync sessions, engines, and configs
        - Improved dependency injection with new provider methods
        - Simplified extension initialization and registration
        - Updated example and test files to reflect new extension structure
        - Removed deprecated methods and simplified the extension interface



.. changelog:: 0.33.2
    :date: 2025-03-09

    .. change:: simplify session type hints in service providers
        :type: bugfix
        :pr: 414

        Remove unnecessary scoped session type hints from service provider functions.

        Prevents the following exception from being incorrectly raised:

        `TypeError: Type unions may not contain more than one custom type - type typing.Union[sqlalchemy.ext.asyncio.session.AsyncSession, sqlalchemy.ext.asyncio.scoping.async_scoped_session[sqlalchemy.ext.asyncio.session.AsyncSession], NoneType] is not supported.`


.. changelog:: 0.33.1
    :date: 2025-03-07

    .. change:: add session to namespace signature
        :type: feature
        :pr: 412

        The new filter providers expect that the sessions are in the signature namespace.  This ensures there are no issues when configuring the plugin.


.. changelog:: 0.33.0
    :date: 2025-03-07

    .. change:: Add dependency factory utilities
        :type: feature
        :pr: 405

        Introduces a new module `advanced_alchemy.extensions.litestar.providers` with comprehensive dependency injection utilities for SQLAlchemy services in Litestar. The module provides:

        - Dynamic filter configuration generation
        - Dependency caching mechanism
        - Flexible filter and pagination support
        - Singleton metaclass for dependency management
        - Configurable filter and search dependencies


.. changelog:: 0.32.2
    :date: 2025-02-26

    .. change:: Litestar extension: Use ``SerializationPlugin`` instead of ``SerializationPluginProtocol``
        :type: misc
        :pr: 401

        Use ``SerializationPlugin`` instead of ``SerializationPluginProtocol``


.. changelog:: 0.32.1
    :date: 2025-02-26

    .. change:: Litestar extension: Use ``CLIPlugin`` instead of ``CLIPluginProtocol``
        :type: misc
        :pr: 399

        Internal change migrating from using Litestar's ``CLIPluginProtocol`` to
        ``CLIPlugin``.


.. changelog:: 0.32.0
    :date: 2025-02-23

    .. change:: remove `limit` and `offset` from count statement
        :type: bugfix
        :pr: 395

        Remove `limit` and `offset` from count statement

    .. change:: rename `force_basic_query_mode`
        :type: misc
        :pr: 396

        Renames `force_basic_query_mode` to `count_with_window_function`.  This is also exposed as a class/init parameter for the service and repository.

    .. change:: add Enum to default type decoders
        :type: feature
        :pr: 397

        Extends the default `msgspec` type decoders to handle Enum types by converting them to their underlying value during serialization



.. changelog:: 0.31.0
    :date: 2025-02-18

    .. change:: Fix reference in `changelog.py`
        :type: bugfix
        :pr: 383

        Should link to the AA repo, not litestar :)

    .. change:: Query repository list method for custom queries
        :type: bugfix
        :pr: 379
        :issue: 338

        Fix query repositories list method according to [documentation](https://docs.advanced-alchemy.litestar.dev/latest/usage/repositories.html#query-repository).

        Now its return a list of tuples with values instead of first column of the query.

    .. change:: remove 3.8 support
        :type: misc
        :pr: 386

        Removes 3.8 support and removes future annotations in a few places for better compatibility

    .. change:: remove future annotations
        :type: feature
        :pr: 387

        This removes the usage of future annotations.

    .. change:: add `uniquify` to service and repo
        :type: feature
        :pr: 389

        Exposes the `uniquify` flag in all functions on the repository and add to the service

    .. change:: improved default serializer
        :type: feature
        :pr: 390

        Improves the default serializer so that it handles various types a bit better


.. changelog:: 0.30.3
    :date: 2025-01-26

    .. change:: add `wrap_exceptions` option to exception handler.
        :type: feature
        :pr: 363
        :issue: 356

        When `wrap_exceptions` is `False`, the original SQLAlchemy error message will be raised instead of the wrapped Repository error

        Fixes #356 (Bug: `wrap_sqlalchemy_exception` masks db errors)

    .. change:: simplify configuration hash
        :type: feature
        :pr: 366

        The hashing method on the SQLAlchemy configs can be simplified.  This should be enough to define a unique configuration.

    .. change:: use `lifespan` context manager in Starlette and FastAPI
        :type: bugfix
        :pr: 368
        :issue: 367

        Modifies the Starlette and FastAPI integrations to use the `lifespan` context manager instead of the `startup`\`shutdown` hooks.  If the application already has a lifespan set, it is wrapped so that both execute.


.. changelog:: 0.30.2
    :date: 2025-01-21

    .. change:: add hash to config classes
        :type: feature
        :pr: 358
        :issue: 357

        Adds hash function to `SQLAlchemySyncConfig` and `SQLAlchemyAsyncConfig` classes.


.. changelog:: 0.30.1
    :date: 2025-01-20

    .. change:: Using init db CLI command creates migrations directory in unexpected place
        :type: bugfix
        :pr: 354
        :issue: 351

        When initializing migrations with the CLI, if no directory is specified, the directory from the configuration will be used.


.. changelog:: 0.30.0
    :date: 2025-01-19

    .. change:: standardize on `autocommit_include_redirect`
        :type: bugfix
        :pr: 349

        The flask plugin incorrectly used the term `autocommit_with_redirect` instead of the existing `autocommit_include_redirect`.

        This changes makes the name consistent before we bump to a `1.x` release

    .. change:: implement default schema serializer
        :type: bugfix
        :pr: 350

        This corrects an issue that caused the Flask extension to use the incorrect serializer for encoding JSON

    .. change:: refactored integration with CLI support
        :type: feature
        :pr: 352

        Refactored the Starlette and FastAPI integration to support multiple configurations and sessions.  Additionally, FastAPI will now have the database commands automatically registered with the FastAPI CLI.

    .. change:: reorganize Sanic extension
        :type: feature
        :pr: 353

        The Sanic integration now aligns with the structure and idioms used in the other integrations.


.. changelog:: 0.29.1
    :date: 2025-01-17

    .. change:: add convenience hooks for `to_model` operations
        :type: feature
        :pr: 347

        The service layer has always has a `to_model` function that accepts data and optionally an operation name.  It would return a SQLAlchemy model no matter the input you gave it.

        It is possible to move business logic into this `to_model` layer for populating fields on insert.  (i.e. slug fields or tags, etc.).

        When having logic for `insert`, `update`, `delete`, and `upsert`, that function can be a bit overwhelcoming.  Now, there are helper functions that you can use that is specific to each DML hook:

        * `to_model_on_create`
        * `to_model_on_update`
        * `to_model_on_delete`
        * `to_model_on_upsert`


.. changelog:: 0.29.0
    :date: 2025-01-17

    .. change:: fully qualify all `datetime` module references
        :type: bugfix
        :pr: 341

        All date time references are now full qualified to prevent any forward resolution issues with

        `from datetime import datetime`

        and

        `import datetime`

    .. change:: disabled `timezone` in alembic.ini
        :type: bugfix
        :pr: 344

        Disabled `timezone` in alembic.ini to fix `alembic.util.exc.CommandError: Can't locate timezone: UTC` error while applying migrations

        Reference:
        https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file

    .. change:: various typing improvements for services
        :type: feature
        :pr: 342
        :issue: 261

        Improved typing in the service layer and adds a additional type guards.

    .. change:: Auto extend Flask CLI and add session integration
        :type: feature
        :pr: 111

        The Advanced Alchemy alembic CLI is now auto-extended to your Flask application.

        The Flask extension now also has a session handling middleware for handling auto-commits.

        Last, but not least, there's an experimental async portal that integrates a long running asyncio loop for running async operations in Flask.  Using `foo = portal.call(<async function>)` you can get the result of an asynchronous function from a sync context.



.. changelog:: 0.28.0
    :date: 2025-01-13

    .. change:: add `bind-key` option to CLI
        :type: feature
        :pr: 339

        Adds a `bind-key` option to the Advance Alchemy CLI groups.

        When present, the Alembic configs will be injected with the corresponding key.


.. changelog:: 0.27.1
    :date: 2025-01-11

    .. change:: correction for `3.8` and `3.9` type hints
        :type: bugfix
        :pr: 330

        Makes a few corrections to type hints in examples and tests to ensure 3.8 and 3.9 support


.. changelog:: 0.27.0
    :date: 2025-01-11


    .. change:: add `error_messages` as class level configuration
        :type: feature
        :pr: 315

        Exposes ``error_messages`` as a class level configuration in the repository and service classes.

    .. change:: implement reusable CLI
        :type: feature
        :pr: 320

        Exposes a reusable CLI for creating and updating releases.  This can be used to extend any existing Click or Typer CLI.

    .. change:: adds additional type guard helpers
        :type: feature
        :pr: 322

        Addition typing utilities to help with type checking and validation.



.. changelog:: 0.26.0
    :date: 2025-01-11

    .. change:: `AsyncAttrs` & remove `noload` default
        :type: feature
        :pr: 305

        This PR adds the `AsyncAttrs` to the default declarative bases for convenience.

        It also changes the `inherit_lazy_relationships == False` behavior to use `lazyload`.  SQLAlchemy will be deprecating `noload` in version 2.1

    .. change:: `litestar` DTO enhancements
        :type: feature
        :pr: 310
        :issue: 306

        The Litestar DTO has been enhanced with:
        - The SQLAlchemyDTOConfig's `exclude`, `include`, and `rename_fields` fields will now accept string or `InstrumentedAttributes`
        - DTO supports `WriteOnlyMapped` and `DynamicMapped`


    .. change:: add default exception handler for `litestar` integration
        :type: feature
        :pr: 308
        :issue: 275

        This adds a configuration option to automatically enable an exception handler for Repository errors.

        This will update the exception handler if you do not have one already configured for the RepositoryException class


.. changelog:: 0.25.0
    :date: 2025-01-11

    .. change:: add max length for encrypted string
        :type: feature
        :pr: 290

        The EncryptedString field now has the ability to validate against a set length.


    .. change:: `AsyncAttrs` & remove `noload` default
        :type: feature
        :pr: 305

        This PR adds the `AsyncAttrs` to the default declarative bases for convenience.

        It also changes the `inherit_lazy_relationships == False` behavior to use `lazyload`.  SQLAlchemy will be deprecating `noload` in version 2.1


.. changelog:: 0.24.0
    :date: 2025-01-11

    .. change:: remove lambda statement usage
        :type: feature
        :pr: 288
        :issue: 286, 287

        Removes the use of lambda statements in the repository and service classes.  This has no change on the end user API, however, it should remove strange queries errors seen.

.. changelog:: 0.23.0
    :date: 2025-01-11

    .. change:: regression caused by conditional import Sequence for pagination.py
        :type: bugfix
        :pr: 274
        :issue: 272

        Import Sequence directly from collections.abc
        Remove conditional import using TYPE_CHECKING
        Add noqa comment to suppress potential linter warnings

    .. change:: make sure `anyio` is optional
        :type: bugfix
        :pr: 278

        When running standalone or with a synchronous web framework, `anyio` is not required.  This PR ensures that there are no module loading failures due to the missing import.

    .. change:: Improved typing of `ModelDictT`
        :type: feature
        :pr: 277

        Fixes typing issues in service


        https://github.com/litestar-org/advanced-alchemy/issues/265

        This still doesn't solve the problem of UnknownVariableType if the subtypes of ModelDictT are not installed (eg: Pydantic)
        But at least it solves the problem of incompatibilities when they are installed


.. changelog:: 0.22.0
    :date: 2025-01-11

    .. change:: CLI argument adjustment
        :type: bugfix
        :pr: 270

        Changes the argument name so that it matches the name given in `click.option`.


.. changelog:: 0.21.0
    :date: 2025-01-11

    .. change:: bind session to session class instead of to the session maker
        :type: bugfix
        :pr: 268
        :issue: 267

        binds session into sanic extension as expected

        in the original code, session maker was defined and then the dependency for session overwrites it with a session maker as the type.  this seems non-ideal -- you can't get the session maker and when you ask for the session maker you get a session object

        instead, this looks at the sessionmaker `class_` property for adding the sanic dependency


    .. change:: correct regex mappings for duplicate and foreign key errors
        :type: bugfix
        :pr: 266
        :issue: 262

        Swap the variable names for DUPLICATE_KEY_REGEXES and FOREIGN_KEY_REGEXES to correctly match their contents.
        This ensures that the error detection for duplicate keys and foreign key violations works as intended across different database backends.

    .. change:: Dump all tables as JSON
        :type: feature
        :pr: 259

        Adds a new CLI command to export tables to JSON.  Similar to a Django dumpdata command.


.. changelog:: <=0.20.0
    :date: 2025-01-11

    .. change:: CollectionFilter returns all entries if values is empty
        :type: bugfix
        :pr: 52
        :issue: 51

        Fixes #51

        Bug: CollectionFilter returns all entries if values is empty

        a simple `1=-1` is appended into the `where` clause when an empty list is passed into the `in` statement.

    .. change:: better handle empty collection filters
        :type: bugfix
        :pr: 62

        Currently, [this](https://github.com/cofin/litestar-fullstack/blob/main/src/app/lib/dependencies.py#L169) is how you can inject these filters in your app.

        When using the `id_filter` dependency on it's own, you have to have an additional not-null check before passing it into the repository.

        This change handles that and allows you to pass in all filters into the repository function without checking their nullability.

    .. change:: service `exists` should use `exists` from repository
        :type: bugfix
        :pr: 68

        The service should use the repository's implementation of `exists` instead of a new one with a `count`.

    .. change:: do not set `id` with `item_id` when `None`
        :type: bugfix
        :pr: 67

        This PR prevents the primary key from being overrwitten with `None` when using the service without the `item_id` parameter.

    .. change:: sqlalchemy dto for models non `Column` fields
        :type: bugfix
        :pr: 75

        Examples of such fields are `ColumnClause` and `Label`, these are generated when using `sqlalchemy.func`

        - Fix SQLAlchemy dto generation for litestar when using models that have fields that are not instances of `Column`. Such fields arise from using expressions such as `func`.