xdjango-postgres-extra 2.1.0__tar.gz → 2.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. xdjango_postgres_extra-2.1.2/PKG-INFO +208 -0
  2. xdjango_postgres_extra-2.1.2/README.md +111 -0
  3. xdjango_postgres_extra-2.1.2/psqlextra/_version.py +1 -0
  4. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/setup.py +8 -4
  5. xdjango_postgres_extra-2.1.2/tests/test_django_6_compatibility.py +33 -0
  6. xdjango_postgres_extra-2.1.2/xdjango_postgres_extra.egg-info/PKG-INFO +208 -0
  7. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/SOURCES.txt +1 -6
  8. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/requires.txt +3 -3
  9. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/top_level.txt +0 -1
  10. xdjango_postgres_extra-2.1.0/PKG-INFO +0 -202
  11. xdjango_postgres_extra-2.1.0/README.md +0 -112
  12. xdjango_postgres_extra-2.1.0/psqlextra/_version.py +0 -1
  13. xdjango_postgres_extra-2.1.0/tests/benchmarks/__init__.py +0 -0
  14. xdjango_postgres_extra-2.1.0/tests/benchmarks/test_insert_nothing.py +0 -51
  15. xdjango_postgres_extra-2.1.0/tests/benchmarks/test_upsert.py +0 -51
  16. xdjango_postgres_extra-2.1.0/tests/benchmarks/test_upsert_bulk.py +0 -68
  17. xdjango_postgres_extra-2.1.0/tests/psqlextra_test_backend/__init__.py +0 -0
  18. xdjango_postgres_extra-2.1.0/tests/psqlextra_test_backend/base.py +0 -23
  19. xdjango_postgres_extra-2.1.0/xdjango_postgres_extra.egg-info/PKG-INFO +0 -202
  20. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/LICENSE +0 -0
  21. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/__init__.py +0 -0
  22. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/apps.py +0 -0
  23. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/__init__.py +0 -0
  24. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/base.py +0 -0
  25. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/base_impl.py +0 -0
  26. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/introspection.py +0 -0
  27. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/__init__.py +0 -0
  28. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/__init__.py +0 -0
  29. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_default_partition.py +0 -0
  30. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_hash_partition.py +0 -0
  31. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_list_partition.py +0 -0
  32. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_range_partition.py +0 -0
  33. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/apply_state.py +0 -0
  34. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_materialized_view_model.py +0 -0
  35. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_partitioned_model.py +0 -0
  36. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_view_model.py +0 -0
  37. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_default_partition.py +0 -0
  38. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_hash_partition.py +0 -0
  39. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_list_partition.py +0 -0
  40. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_materialized_view_model.py +0 -0
  41. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_partition.py +0 -0
  42. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_partitioned_model.py +0 -0
  43. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_range_partition.py +0 -0
  44. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_view_model.py +0 -0
  45. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/partition.py +0 -0
  46. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_autodetector.py +0 -0
  47. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_migrations.py +0 -0
  48. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_project_state.py +0 -0
  49. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/__init__.py +0 -0
  50. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/materialized_view.py +0 -0
  51. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/model.py +0 -0
  52. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/partitioning.py +0 -0
  53. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/view.py +0 -0
  54. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/operations.py +0 -0
  55. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/schema.py +0 -0
  56. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/__init__.py +0 -0
  57. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/hstore_required.py +0 -0
  58. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/hstore_unique.py +0 -0
  59. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/compiler.py +0 -0
  60. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/__init__.py +0 -0
  61. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/expressions.py +0 -0
  62. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/model_data_migrator.py +0 -0
  63. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/static_row.py +0 -0
  64. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/transaction.py +0 -0
  65. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/error.py +0 -0
  66. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/expressions.py +0 -0
  67. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/fields/__init__.py +0 -0
  68. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/fields/hstore_field.py +0 -0
  69. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/__init__.py +0 -0
  70. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/case_insensitive_unique_index.py +0 -0
  71. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/conditional_unique_index.py +0 -0
  72. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/unique_index.py +0 -0
  73. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/__init__.py +0 -0
  74. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/fields.py +0 -0
  75. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/models.py +0 -0
  76. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/locking.py +0 -0
  77. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/lookups.py +0 -0
  78. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/__init__.py +0 -0
  79. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/__init__.py +0 -0
  80. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgmakemigrations.py +0 -0
  81. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgpartition.py +0 -0
  82. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgrefreshmv.py +0 -0
  83. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/manager/__init__.py +0 -0
  84. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/manager/manager.py +0 -0
  85. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/__init__.py +0 -0
  86. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/base.py +0 -0
  87. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/options.py +0 -0
  88. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/partitioned.py +0 -0
  89. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/view.py +0 -0
  90. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/__init__.py +0 -0
  91. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/config.py +0 -0
  92. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/constants.py +0 -0
  93. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/current_time_strategy.py +0 -0
  94. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/error.py +0 -0
  95. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/manager.py +0 -0
  96. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/partition.py +0 -0
  97. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/plan.py +0 -0
  98. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/range_partition.py +0 -0
  99. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/range_strategy.py +0 -0
  100. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/shorthands.py +0 -0
  101. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/strategy.py +0 -0
  102. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_partition.py +0 -0
  103. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_partition_size.py +0 -0
  104. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_strategy.py +0 -0
  105. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/py.typed +0 -0
  106. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/query.py +0 -0
  107. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/schema.py +0 -0
  108. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/settings.py +0 -0
  109. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/sql.py +0 -0
  110. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/type_assertions.py +0 -0
  111. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/types.py +0 -0
  112. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/util.py +0 -0
  113. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/pyproject.toml +0 -0
  114. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/setup.cfg +0 -0
  115. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_append_caller_to_sql.py +0 -0
  116. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_case_insensitive_unique_index.py +0 -0
  117. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_conditional_unique_index.py +0 -0
  118. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_db_backend.py +0 -0
  119. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_autodetect.py +0 -0
  120. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_field.py +0 -0
  121. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_required.py +0 -0
  122. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_unique.py +0 -0
  123. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_insert.py +0 -0
  124. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_introspect.py +0 -0
  125. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_locking.py +0 -0
  126. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_lookups.py +0 -0
  127. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_make_migrations.py +0 -0
  128. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_management_command_partition.py +0 -0
  129. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_manager.py +0 -0
  130. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_manager_context.py +0 -0
  131. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_materialized_view_model.py +0 -0
  132. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_migration_operations.py +0 -0
  133. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict.py +0 -0
  134. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict_nothing.py +0 -0
  135. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict_update.py +0 -0
  136. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioned_model.py +0 -0
  137. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioned_model_state.py +0 -0
  138. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioning_manager.py +0 -0
  139. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioning_time.py +0 -0
  140. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_query.py +0 -0
  141. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_query_values.py +0 -0
  142. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema.py +0 -0
  143. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_alter_schema.py +0 -0
  144. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_clone_model_to_schema.py +0 -0
  145. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_partitioning.py +0 -0
  146. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_storage_settings.py +0 -0
  147. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_vacuum.py +0 -0
  148. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_view.py +0 -0
  149. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_settings.py +0 -0
  150. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_unique_index.py +0 -0
  151. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_upsert.py +0 -0
  152. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_view_models.py +0 -0
  153. {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/dependency_links.txt +0 -0
@@ -0,0 +1,208 @@
1
+ Metadata-Version: 2.4
2
+ Name: xdjango-postgres-extra
3
+ Version: 2.1.2
4
+ Summary: Bringing all of PostgreSQL's awesomeness to Django.
5
+ Home-page: https://github.com/SectorLabs/django-postgres-extra
6
+ Author: Sector Labs
7
+ Author-email: open-source@sectorlabs.ro
8
+ License: MIT License
9
+ Keywords: django,postgres,extra,hstore,upsert,partioning,materialized,view
10
+ Classifier: Environment :: Web Environment
11
+ Classifier: Framework :: Django
12
+ Classifier: Framework :: Django :: 6.0
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python
17
+ Classifier: Programming Language :: Python :: 3.6
18
+ Classifier: Programming Language :: Python :: 3.7
19
+ Classifier: Programming Language :: Python :: 3.8
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
26
+ Classifier: Topic :: Internet :: WWW/HTTP
27
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
28
+ Requires-Python: >=3.6
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Requires-Dist: Django<7.0,>=2.0
32
+ Requires-Dist: python-dateutil<=3.0.0,>=2.8.0
33
+ Requires-Dist: dataclasses; python_version <= "3.6"
34
+ Provides-Extra: dev
35
+ Requires-Dist: poethepoet==0.34.0; python_version >= "3.9" and extra == "dev"
36
+ Requires-Dist: poethepoet==0.30.0; (python_version >= "3.8" and python_version < "3.9") and extra == "dev"
37
+ Requires-Dist: poethepoet==0.19.0; (python_version >= "3.7" and python_version < "3.8") and extra == "dev"
38
+ Requires-Dist: poethepoet==0.13.1; (python_version >= "3.6" and python_version < "3.7") and extra == "dev"
39
+ Provides-Extra: test
40
+ Requires-Dist: psycopg2==2.9.10; python_version >= "3.8" and extra == "test"
41
+ Requires-Dist: psycopg2==2.9.9; (python_version >= "3.7" and python_version < "3.8") and extra == "test"
42
+ Requires-Dist: psycopg2==2.9.8; (python_version >= "3.6" and python_version < "3.7") and extra == "test"
43
+ Requires-Dist: types-psycopg2==2.9.21.20250516; python_version >= "3.9" and extra == "test"
44
+ Requires-Dist: types-psycopg2==2.9.8; (python_version >= "3.6" and python_version < "3.9") and extra == "test"
45
+ Requires-Dist: pytest==8.4.0; python_version > "3.8" and extra == "test"
46
+ Requires-Dist: pytest==7.0.1; python_version <= "3.8" and extra == "test"
47
+ Requires-Dist: pytest-benchmark==5.1.0; python_version > "3.8" and extra == "test"
48
+ Requires-Dist: pytest-benchmark==3.4.1; python_version <= "3.8" and extra == "test"
49
+ Requires-Dist: pytest-django==4.11.1; python_version > "3.7" and extra == "test"
50
+ Requires-Dist: pytest-django==4.5.2; python_version <= "3.7" and extra == "test"
51
+ Requires-Dist: pytest-cov==6.1.1; python_version > "3.8" and extra == "test"
52
+ Requires-Dist: pytest-cov==4.0.0; python_version <= "3.8" and extra == "test"
53
+ Requires-Dist: coverage==7.8.2; python_version > "3.8" and extra == "test"
54
+ Requires-Dist: coverage==7.6.1; (python_version >= "3.8" and python_version <= "3.8") and extra == "test"
55
+ Requires-Dist: coverage==6.2; python_version <= "3.7" and extra == "test"
56
+ Requires-Dist: tox==4.26.0; python_version > "3.8" and extra == "test"
57
+ Requires-Dist: tox==3.28.0; python_version <= "3.8" and extra == "test"
58
+ Requires-Dist: freezegun==1.5.2; python_version > "3.7" and extra == "test"
59
+ Requires-Dist: freezegun==1.2.2; python_version <= "3.7" and extra == "test"
60
+ Requires-Dist: syrupy==4.9.1; python_version >= "3.9" and extra == "test"
61
+ Requires-Dist: syrupy==2.3.1; python_version <= "3.8" and extra == "test"
62
+ Provides-Extra: test-report
63
+ Requires-Dist: coveralls==4.0.1; extra == "test-report"
64
+ Provides-Extra: analysis
65
+ Requires-Dist: black==22.3.0; extra == "analysis"
66
+ Requires-Dist: flake8==7.2.0; extra == "analysis"
67
+ Requires-Dist: autoflake==2.3.1; extra == "analysis"
68
+ Requires-Dist: autopep8==2.3.2; extra == "analysis"
69
+ Requires-Dist: isort==6.0.1; extra == "analysis"
70
+ Requires-Dist: docformatter==1.7.7; extra == "analysis"
71
+ Requires-Dist: mypy==1.16.0; extra == "analysis"
72
+ Requires-Dist: django-stubs==4.2.7; extra == "analysis"
73
+ Requires-Dist: typing-extensions==4.14.0; extra == "analysis"
74
+ Requires-Dist: types-dj-database-url==1.3.0.4; extra == "analysis"
75
+ Requires-Dist: types-python-dateutil==2.9.0.20250516; extra == "analysis"
76
+ Provides-Extra: docs
77
+ Requires-Dist: Sphinx==8.2.3; extra == "docs"
78
+ Requires-Dist: sphinx-rtd-theme==3.0.2; extra == "docs"
79
+ Requires-Dist: docutils==0.21.2; extra == "docs"
80
+ Requires-Dist: Jinja2==3.1.6; extra == "docs"
81
+ Provides-Extra: publish
82
+ Requires-Dist: build<2.0.0,>=1.2.0; extra == "publish"
83
+ Requires-Dist: twine<7.0.0,>=6.0.0; extra == "publish"
84
+ Dynamic: author
85
+ Dynamic: author-email
86
+ Dynamic: classifier
87
+ Dynamic: description
88
+ Dynamic: description-content-type
89
+ Dynamic: home-page
90
+ Dynamic: keywords
91
+ Dynamic: license
92
+ Dynamic: license-file
93
+ Dynamic: provides-extra
94
+ Dynamic: requires-dist
95
+ Dynamic: requires-python
96
+ Dynamic: summary
97
+
98
+ # xdjango-postgres-extra
99
+
100
+ [![PyPI version](https://img.shields.io/pypi/v/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/)
101
+ [![Python versions](https://img.shields.io/pypi/pyversions/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/)
102
+ [![Django 6](https://img.shields.io/badge/Django-6.0-0C4B33.svg)](https://docs.djangoproject.com/en/6.0/)
103
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
104
+
105
+ `xdjango-postgres-extra` is a maintained fork of
106
+ [`django-postgres-extra`](https://github.com/SectorLabs/django-postgres-extra).
107
+ It extends Django's PostgreSQL backend with features such as atomic upserts,
108
+ table partitioning, views, materialized views, schema management, and explicit
109
+ table locking.
110
+
111
+ The PyPI distribution is named `xdjango-postgres-extra`. The Python package
112
+ and existing imports remain named `psqlextra`.
113
+
114
+ ## Compatibility
115
+
116
+ - Django: 2.0 through 6.x (`Django>=2.0,<7.0`)
117
+ - Python: 3.6 through 3.14
118
+ - PostgreSQL: 11 or newer
119
+ - Psycopg: 2 and 3
120
+
121
+ Django 6 requires Python 3.12 or newer. The 2.1.x release line was verified with
122
+ Django 6.0.6 and Python 3.14.
123
+
124
+ ## Installation
125
+
126
+ ```bash
127
+ python -m pip install xdjango-postgres-extra
128
+ ```
129
+
130
+ Use the `psqlextra` database backend in your Django settings:
131
+
132
+ ```python
133
+ DATABASES = {
134
+ "default": {
135
+ "ENGINE": "psqlextra.backend",
136
+ "NAME": "my_database",
137
+ "USER": "my_user",
138
+ "PASSWORD": "my_password",
139
+ "HOST": "localhost",
140
+ "PORT": "5432",
141
+ }
142
+ }
143
+ ```
144
+
145
+ Add the application when using features that require app registration:
146
+
147
+ ```python
148
+ INSTALLED_APPS = [
149
+ # ...
150
+ "django.contrib.postgres",
151
+ "psqlextra",
152
+ ]
153
+ ```
154
+
155
+ Existing application code continues to use `psqlextra` imports:
156
+
157
+ ```python
158
+ from psqlextra.models import PostgresModel
159
+ ```
160
+
161
+ ## Features
162
+
163
+ - Atomic `INSERT ... ON CONFLICT` handling with `DO UPDATE` and `DO NOTHING`
164
+ - Bulk inserts and upserts
165
+ - PostgreSQL range, list, hash, and default table partitions
166
+ - Time-based partition management
167
+ - Database views and materialized views integrated with migrations
168
+ - PostgreSQL schema creation, deletion, and temporary schemas
169
+ - Explicit model and table locks
170
+ - `TRUNCATE TABLE`, including cascading truncation
171
+ - HStore constraints and expressions
172
+ - PostgreSQL-specific indexes and introspection
173
+
174
+ The upstream documentation remains the primary API reference:
175
+
176
+ - [Documentation](https://django-postgres-extra.readthedocs.io/en/master/)
177
+ - [Installation guide](https://django-postgres-extra.readthedocs.io/en/master/installation.html)
178
+ - [Feature reference](https://django-postgres-extra.readthedocs.io/en/master/index.html#features)
179
+
180
+ When following upstream installation instructions, install
181
+ `xdjango-postgres-extra` instead of `django-postgres-extra`.
182
+
183
+ ## Development
184
+
185
+ Create a virtual environment and install the development extras:
186
+
187
+ ```bash
188
+ python -m venv .venv
189
+ source .venv/bin/activate
190
+ python -m pip install -e ".[dev,test]"
191
+ ```
192
+
193
+ Set a PostgreSQL test database URL:
194
+
195
+ ```bash
196
+ export DATABASE_URL="postgres://psqlextra:password@localhost/psqlextra"
197
+ ```
198
+
199
+ Run the available Poe tasks:
200
+
201
+ ```bash
202
+ poe test
203
+ poe verify
204
+ ```
205
+
206
+ ## License
207
+
208
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,111 @@
1
+ # xdjango-postgres-extra
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/)
5
+ [![Django 6](https://img.shields.io/badge/Django-6.0-0C4B33.svg)](https://docs.djangoproject.com/en/6.0/)
6
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+
8
+ `xdjango-postgres-extra` is a maintained fork of
9
+ [`django-postgres-extra`](https://github.com/SectorLabs/django-postgres-extra).
10
+ It extends Django's PostgreSQL backend with features such as atomic upserts,
11
+ table partitioning, views, materialized views, schema management, and explicit
12
+ table locking.
13
+
14
+ The PyPI distribution is named `xdjango-postgres-extra`. The Python package
15
+ and existing imports remain named `psqlextra`.
16
+
17
+ ## Compatibility
18
+
19
+ - Django: 2.0 through 6.x (`Django>=2.0,<7.0`)
20
+ - Python: 3.6 through 3.14
21
+ - PostgreSQL: 11 or newer
22
+ - Psycopg: 2 and 3
23
+
24
+ Django 6 requires Python 3.12 or newer. The 2.1.x release line was verified with
25
+ Django 6.0.6 and Python 3.14.
26
+
27
+ ## Installation
28
+
29
+ ```bash
30
+ python -m pip install xdjango-postgres-extra
31
+ ```
32
+
33
+ Use the `psqlextra` database backend in your Django settings:
34
+
35
+ ```python
36
+ DATABASES = {
37
+ "default": {
38
+ "ENGINE": "psqlextra.backend",
39
+ "NAME": "my_database",
40
+ "USER": "my_user",
41
+ "PASSWORD": "my_password",
42
+ "HOST": "localhost",
43
+ "PORT": "5432",
44
+ }
45
+ }
46
+ ```
47
+
48
+ Add the application when using features that require app registration:
49
+
50
+ ```python
51
+ INSTALLED_APPS = [
52
+ # ...
53
+ "django.contrib.postgres",
54
+ "psqlextra",
55
+ ]
56
+ ```
57
+
58
+ Existing application code continues to use `psqlextra` imports:
59
+
60
+ ```python
61
+ from psqlextra.models import PostgresModel
62
+ ```
63
+
64
+ ## Features
65
+
66
+ - Atomic `INSERT ... ON CONFLICT` handling with `DO UPDATE` and `DO NOTHING`
67
+ - Bulk inserts and upserts
68
+ - PostgreSQL range, list, hash, and default table partitions
69
+ - Time-based partition management
70
+ - Database views and materialized views integrated with migrations
71
+ - PostgreSQL schema creation, deletion, and temporary schemas
72
+ - Explicit model and table locks
73
+ - `TRUNCATE TABLE`, including cascading truncation
74
+ - HStore constraints and expressions
75
+ - PostgreSQL-specific indexes and introspection
76
+
77
+ The upstream documentation remains the primary API reference:
78
+
79
+ - [Documentation](https://django-postgres-extra.readthedocs.io/en/master/)
80
+ - [Installation guide](https://django-postgres-extra.readthedocs.io/en/master/installation.html)
81
+ - [Feature reference](https://django-postgres-extra.readthedocs.io/en/master/index.html#features)
82
+
83
+ When following upstream installation instructions, install
84
+ `xdjango-postgres-extra` instead of `django-postgres-extra`.
85
+
86
+ ## Development
87
+
88
+ Create a virtual environment and install the development extras:
89
+
90
+ ```bash
91
+ python -m venv .venv
92
+ source .venv/bin/activate
93
+ python -m pip install -e ".[dev,test]"
94
+ ```
95
+
96
+ Set a PostgreSQL test database URL:
97
+
98
+ ```bash
99
+ export DATABASE_URL="postgres://psqlextra:password@localhost/psqlextra"
100
+ ```
101
+
102
+ Run the available Poe tasks:
103
+
104
+ ```bash
105
+ poe test
106
+ poe verify
107
+ ```
108
+
109
+ ## License
110
+
111
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1 @@
1
+ __version__ = "2.1.2"
@@ -7,7 +7,7 @@ exec(open("psqlextra/_version.py").read())
7
7
  with open(
8
8
  os.path.join(os.path.dirname(__file__), "README.md"), encoding="utf-8"
9
9
  ) as readme:
10
- README = readme.read().split("h1>\n", 2)[1]
10
+ README = readme.read()
11
11
 
12
12
 
13
13
  setup(
@@ -36,6 +36,7 @@ setup(
36
36
  classifiers=[
37
37
  "Environment :: Web Environment",
38
38
  "Framework :: Django",
39
+ "Framework :: Django :: 6.0",
39
40
  "Intended Audience :: Developers",
40
41
  "License :: OSI Approved :: MIT License",
41
42
  "Operating System :: OS Independent",
@@ -46,12 +47,15 @@ setup(
46
47
  "Programming Language :: Python :: 3.9",
47
48
  "Programming Language :: Python :: 3.10",
48
49
  "Programming Language :: Python :: 3.11",
50
+ "Programming Language :: Python :: 3.12",
51
+ "Programming Language :: Python :: 3.13",
52
+ "Programming Language :: Python :: 3.14",
49
53
  "Topic :: Internet :: WWW/HTTP",
50
54
  "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
51
55
  ],
52
56
  python_requires=">=3.6",
53
57
  install_requires=[
54
- "Django>=2.0,<=6.0.4",
58
+ "Django>=2.0,<7.0",
55
59
  "python-dateutil>=2.8.0,<=3.0.0",
56
60
  ],
57
61
  extras_require={
@@ -109,8 +113,8 @@ setup(
109
113
  "Jinja2==3.1.6",
110
114
  ],
111
115
  "publish": [
112
- "build==0.7.0",
113
- "twine==3.7.1",
116
+ "build>=1.2.0,<2.0.0",
117
+ "twine>=6.0.0,<7.0.0",
114
118
  ],
115
119
  },
116
120
  )
@@ -0,0 +1,33 @@
1
+ from psqlextra.expressions import HStoreValue
2
+ from psqlextra.lookups import InValuesLookupMixin
3
+
4
+
5
+ class CompilableValue:
6
+ def as_sql(self, compiler, connection):
7
+ return "UPPER(%s)", ("value",)
8
+
9
+
10
+ class InValuesLookup(InValuesLookupMixin):
11
+ def rhs_is_direct_value(self):
12
+ return True
13
+
14
+ def process_lhs(self, compiler, connection):
15
+ return '"field"', ("lhs",)
16
+
17
+ def process_rhs(self, compiler, connection):
18
+ return "%s, %s", ("one", "two")
19
+
20
+
21
+ def test_hstore_value_returns_tuple_params():
22
+ _, params = HStoreValue(
23
+ {"expression": CompilableValue(), "plain": "value", "null": None}
24
+ ).as_sql(None, None)
25
+
26
+ assert params == ("expression", "value", "plain", "value", "null")
27
+
28
+
29
+ def test_invalues_lookup_returns_tuple_params():
30
+ sql, params = InValuesLookup().as_sql(None, None)
31
+
32
+ assert sql == '"field" IN (VALUES (%s),(%s))'
33
+ assert params == ("lhs", "one", "two")
@@ -0,0 +1,208 @@
1
+ Metadata-Version: 2.4
2
+ Name: xdjango-postgres-extra
3
+ Version: 2.1.2
4
+ Summary: Bringing all of PostgreSQL's awesomeness to Django.
5
+ Home-page: https://github.com/SectorLabs/django-postgres-extra
6
+ Author: Sector Labs
7
+ Author-email: open-source@sectorlabs.ro
8
+ License: MIT License
9
+ Keywords: django,postgres,extra,hstore,upsert,partioning,materialized,view
10
+ Classifier: Environment :: Web Environment
11
+ Classifier: Framework :: Django
12
+ Classifier: Framework :: Django :: 6.0
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python
17
+ Classifier: Programming Language :: Python :: 3.6
18
+ Classifier: Programming Language :: Python :: 3.7
19
+ Classifier: Programming Language :: Python :: 3.8
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
26
+ Classifier: Topic :: Internet :: WWW/HTTP
27
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
28
+ Requires-Python: >=3.6
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Requires-Dist: Django<7.0,>=2.0
32
+ Requires-Dist: python-dateutil<=3.0.0,>=2.8.0
33
+ Requires-Dist: dataclasses; python_version <= "3.6"
34
+ Provides-Extra: dev
35
+ Requires-Dist: poethepoet==0.34.0; python_version >= "3.9" and extra == "dev"
36
+ Requires-Dist: poethepoet==0.30.0; (python_version >= "3.8" and python_version < "3.9") and extra == "dev"
37
+ Requires-Dist: poethepoet==0.19.0; (python_version >= "3.7" and python_version < "3.8") and extra == "dev"
38
+ Requires-Dist: poethepoet==0.13.1; (python_version >= "3.6" and python_version < "3.7") and extra == "dev"
39
+ Provides-Extra: test
40
+ Requires-Dist: psycopg2==2.9.10; python_version >= "3.8" and extra == "test"
41
+ Requires-Dist: psycopg2==2.9.9; (python_version >= "3.7" and python_version < "3.8") and extra == "test"
42
+ Requires-Dist: psycopg2==2.9.8; (python_version >= "3.6" and python_version < "3.7") and extra == "test"
43
+ Requires-Dist: types-psycopg2==2.9.21.20250516; python_version >= "3.9" and extra == "test"
44
+ Requires-Dist: types-psycopg2==2.9.8; (python_version >= "3.6" and python_version < "3.9") and extra == "test"
45
+ Requires-Dist: pytest==8.4.0; python_version > "3.8" and extra == "test"
46
+ Requires-Dist: pytest==7.0.1; python_version <= "3.8" and extra == "test"
47
+ Requires-Dist: pytest-benchmark==5.1.0; python_version > "3.8" and extra == "test"
48
+ Requires-Dist: pytest-benchmark==3.4.1; python_version <= "3.8" and extra == "test"
49
+ Requires-Dist: pytest-django==4.11.1; python_version > "3.7" and extra == "test"
50
+ Requires-Dist: pytest-django==4.5.2; python_version <= "3.7" and extra == "test"
51
+ Requires-Dist: pytest-cov==6.1.1; python_version > "3.8" and extra == "test"
52
+ Requires-Dist: pytest-cov==4.0.0; python_version <= "3.8" and extra == "test"
53
+ Requires-Dist: coverage==7.8.2; python_version > "3.8" and extra == "test"
54
+ Requires-Dist: coverage==7.6.1; (python_version >= "3.8" and python_version <= "3.8") and extra == "test"
55
+ Requires-Dist: coverage==6.2; python_version <= "3.7" and extra == "test"
56
+ Requires-Dist: tox==4.26.0; python_version > "3.8" and extra == "test"
57
+ Requires-Dist: tox==3.28.0; python_version <= "3.8" and extra == "test"
58
+ Requires-Dist: freezegun==1.5.2; python_version > "3.7" and extra == "test"
59
+ Requires-Dist: freezegun==1.2.2; python_version <= "3.7" and extra == "test"
60
+ Requires-Dist: syrupy==4.9.1; python_version >= "3.9" and extra == "test"
61
+ Requires-Dist: syrupy==2.3.1; python_version <= "3.8" and extra == "test"
62
+ Provides-Extra: test-report
63
+ Requires-Dist: coveralls==4.0.1; extra == "test-report"
64
+ Provides-Extra: analysis
65
+ Requires-Dist: black==22.3.0; extra == "analysis"
66
+ Requires-Dist: flake8==7.2.0; extra == "analysis"
67
+ Requires-Dist: autoflake==2.3.1; extra == "analysis"
68
+ Requires-Dist: autopep8==2.3.2; extra == "analysis"
69
+ Requires-Dist: isort==6.0.1; extra == "analysis"
70
+ Requires-Dist: docformatter==1.7.7; extra == "analysis"
71
+ Requires-Dist: mypy==1.16.0; extra == "analysis"
72
+ Requires-Dist: django-stubs==4.2.7; extra == "analysis"
73
+ Requires-Dist: typing-extensions==4.14.0; extra == "analysis"
74
+ Requires-Dist: types-dj-database-url==1.3.0.4; extra == "analysis"
75
+ Requires-Dist: types-python-dateutil==2.9.0.20250516; extra == "analysis"
76
+ Provides-Extra: docs
77
+ Requires-Dist: Sphinx==8.2.3; extra == "docs"
78
+ Requires-Dist: sphinx-rtd-theme==3.0.2; extra == "docs"
79
+ Requires-Dist: docutils==0.21.2; extra == "docs"
80
+ Requires-Dist: Jinja2==3.1.6; extra == "docs"
81
+ Provides-Extra: publish
82
+ Requires-Dist: build<2.0.0,>=1.2.0; extra == "publish"
83
+ Requires-Dist: twine<7.0.0,>=6.0.0; extra == "publish"
84
+ Dynamic: author
85
+ Dynamic: author-email
86
+ Dynamic: classifier
87
+ Dynamic: description
88
+ Dynamic: description-content-type
89
+ Dynamic: home-page
90
+ Dynamic: keywords
91
+ Dynamic: license
92
+ Dynamic: license-file
93
+ Dynamic: provides-extra
94
+ Dynamic: requires-dist
95
+ Dynamic: requires-python
96
+ Dynamic: summary
97
+
98
+ # xdjango-postgres-extra
99
+
100
+ [![PyPI version](https://img.shields.io/pypi/v/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/)
101
+ [![Python versions](https://img.shields.io/pypi/pyversions/xdjango-postgres-extra.svg)](https://pypi.org/project/xdjango-postgres-extra/)
102
+ [![Django 6](https://img.shields.io/badge/Django-6.0-0C4B33.svg)](https://docs.djangoproject.com/en/6.0/)
103
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
104
+
105
+ `xdjango-postgres-extra` is a maintained fork of
106
+ [`django-postgres-extra`](https://github.com/SectorLabs/django-postgres-extra).
107
+ It extends Django's PostgreSQL backend with features such as atomic upserts,
108
+ table partitioning, views, materialized views, schema management, and explicit
109
+ table locking.
110
+
111
+ The PyPI distribution is named `xdjango-postgres-extra`. The Python package
112
+ and existing imports remain named `psqlextra`.
113
+
114
+ ## Compatibility
115
+
116
+ - Django: 2.0 through 6.x (`Django>=2.0,<7.0`)
117
+ - Python: 3.6 through 3.14
118
+ - PostgreSQL: 11 or newer
119
+ - Psycopg: 2 and 3
120
+
121
+ Django 6 requires Python 3.12 or newer. The 2.1.x release line was verified with
122
+ Django 6.0.6 and Python 3.14.
123
+
124
+ ## Installation
125
+
126
+ ```bash
127
+ python -m pip install xdjango-postgres-extra
128
+ ```
129
+
130
+ Use the `psqlextra` database backend in your Django settings:
131
+
132
+ ```python
133
+ DATABASES = {
134
+ "default": {
135
+ "ENGINE": "psqlextra.backend",
136
+ "NAME": "my_database",
137
+ "USER": "my_user",
138
+ "PASSWORD": "my_password",
139
+ "HOST": "localhost",
140
+ "PORT": "5432",
141
+ }
142
+ }
143
+ ```
144
+
145
+ Add the application when using features that require app registration:
146
+
147
+ ```python
148
+ INSTALLED_APPS = [
149
+ # ...
150
+ "django.contrib.postgres",
151
+ "psqlextra",
152
+ ]
153
+ ```
154
+
155
+ Existing application code continues to use `psqlextra` imports:
156
+
157
+ ```python
158
+ from psqlextra.models import PostgresModel
159
+ ```
160
+
161
+ ## Features
162
+
163
+ - Atomic `INSERT ... ON CONFLICT` handling with `DO UPDATE` and `DO NOTHING`
164
+ - Bulk inserts and upserts
165
+ - PostgreSQL range, list, hash, and default table partitions
166
+ - Time-based partition management
167
+ - Database views and materialized views integrated with migrations
168
+ - PostgreSQL schema creation, deletion, and temporary schemas
169
+ - Explicit model and table locks
170
+ - `TRUNCATE TABLE`, including cascading truncation
171
+ - HStore constraints and expressions
172
+ - PostgreSQL-specific indexes and introspection
173
+
174
+ The upstream documentation remains the primary API reference:
175
+
176
+ - [Documentation](https://django-postgres-extra.readthedocs.io/en/master/)
177
+ - [Installation guide](https://django-postgres-extra.readthedocs.io/en/master/installation.html)
178
+ - [Feature reference](https://django-postgres-extra.readthedocs.io/en/master/index.html#features)
179
+
180
+ When following upstream installation instructions, install
181
+ `xdjango-postgres-extra` instead of `django-postgres-extra`.
182
+
183
+ ## Development
184
+
185
+ Create a virtual environment and install the development extras:
186
+
187
+ ```bash
188
+ python -m venv .venv
189
+ source .venv/bin/activate
190
+ python -m pip install -e ".[dev,test]"
191
+ ```
192
+
193
+ Set a PostgreSQL test database URL:
194
+
195
+ ```bash
196
+ export DATABASE_URL="postgres://psqlextra:password@localhost/psqlextra"
197
+ ```
198
+
199
+ Run the available Poe tasks:
200
+
201
+ ```bash
202
+ poe test
203
+ poe verify
204
+ ```
205
+
206
+ ## License
207
+
208
+ MIT. See [LICENSE](LICENSE).
@@ -100,6 +100,7 @@ tests/test_append_caller_to_sql.py
100
100
  tests/test_case_insensitive_unique_index.py
101
101
  tests/test_conditional_unique_index.py
102
102
  tests/test_db_backend.py
103
+ tests/test_django_6_compatibility.py
103
104
  tests/test_hstore_autodetect.py
104
105
  tests/test_hstore_field.py
105
106
  tests/test_hstore_required.py
@@ -134,12 +135,6 @@ tests/test_settings.py
134
135
  tests/test_unique_index.py
135
136
  tests/test_upsert.py
136
137
  tests/test_view_models.py
137
- tests/benchmarks/__init__.py
138
- tests/benchmarks/test_insert_nothing.py
139
- tests/benchmarks/test_upsert.py
140
- tests/benchmarks/test_upsert_bulk.py
141
- tests/psqlextra_test_backend/__init__.py
142
- tests/psqlextra_test_backend/base.py
143
138
  xdjango_postgres_extra.egg-info/PKG-INFO
144
139
  xdjango_postgres_extra.egg-info/SOURCES.txt
145
140
  xdjango_postgres_extra.egg-info/dependency_links.txt
@@ -1,4 +1,4 @@
1
- Django<=6.0.4,>=2.0
1
+ Django<7.0,>=2.0
2
2
  python-dateutil<=3.0.0,>=2.8.0
3
3
 
4
4
  [:python_version <= "3.6"]
@@ -38,8 +38,8 @@ docutils==0.21.2
38
38
  Jinja2==3.1.6
39
39
 
40
40
  [publish]
41
- build==0.7.0
42
- twine==3.7.1
41
+ build<2.0.0,>=1.2.0
42
+ twine<7.0.0,>=6.0.0
43
43
 
44
44
  [test]
45
45