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.
- xdjango_postgres_extra-2.1.2/PKG-INFO +208 -0
- xdjango_postgres_extra-2.1.2/README.md +111 -0
- xdjango_postgres_extra-2.1.2/psqlextra/_version.py +1 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/setup.py +8 -4
- xdjango_postgres_extra-2.1.2/tests/test_django_6_compatibility.py +33 -0
- xdjango_postgres_extra-2.1.2/xdjango_postgres_extra.egg-info/PKG-INFO +208 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/SOURCES.txt +1 -6
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/requires.txt +3 -3
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/top_level.txt +0 -1
- xdjango_postgres_extra-2.1.0/PKG-INFO +0 -202
- xdjango_postgres_extra-2.1.0/README.md +0 -112
- xdjango_postgres_extra-2.1.0/psqlextra/_version.py +0 -1
- xdjango_postgres_extra-2.1.0/tests/benchmarks/__init__.py +0 -0
- xdjango_postgres_extra-2.1.0/tests/benchmarks/test_insert_nothing.py +0 -51
- xdjango_postgres_extra-2.1.0/tests/benchmarks/test_upsert.py +0 -51
- xdjango_postgres_extra-2.1.0/tests/benchmarks/test_upsert_bulk.py +0 -68
- xdjango_postgres_extra-2.1.0/tests/psqlextra_test_backend/__init__.py +0 -0
- xdjango_postgres_extra-2.1.0/tests/psqlextra_test_backend/base.py +0 -23
- xdjango_postgres_extra-2.1.0/xdjango_postgres_extra.egg-info/PKG-INFO +0 -202
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/LICENSE +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/apps.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/base.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/base_impl.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/introspection.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_default_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_hash_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_list_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_range_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/apply_state.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_materialized_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_partitioned_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_default_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_hash_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_list_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_materialized_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_partitioned_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_range_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_autodetector.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_migrations.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_project_state.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/materialized_view.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/partitioning.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/view.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/operations.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/schema.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/hstore_required.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/hstore_unique.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/compiler.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/expressions.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/model_data_migrator.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/static_row.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/transaction.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/error.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/expressions.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/fields/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/fields/hstore_field.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/case_insensitive_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/conditional_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/fields.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/models.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/locking.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/lookups.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgmakemigrations.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgpartition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgrefreshmv.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/manager/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/manager/manager.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/base.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/options.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/partitioned.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/models/view.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/config.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/constants.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/current_time_strategy.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/error.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/manager.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/plan.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/range_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/range_strategy.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/shorthands.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/strategy.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_partition_size.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_strategy.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/py.typed +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/query.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/schema.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/settings.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/sql.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/type_assertions.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/types.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/psqlextra/util.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/pyproject.toml +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/setup.cfg +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_append_caller_to_sql.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_case_insensitive_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_conditional_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_db_backend.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_autodetect.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_field.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_required.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_unique.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_insert.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_introspect.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_locking.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_lookups.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_make_migrations.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_management_command_partition.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_manager.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_manager_context.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_materialized_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_migration_operations.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict_nothing.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict_update.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioned_model.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioned_model_state.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioning_manager.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_partitioning_time.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_query.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_query_values.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_alter_schema.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_clone_model_to_schema.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_partitioning.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_storage_settings.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_vacuum.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_view.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_settings.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_upsert.py +0 -0
- {xdjango_postgres_extra-2.1.0 → xdjango_postgres_extra-2.1.2}/tests/test_view_models.py +0 -0
- {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
|
+
[](https://pypi.org/project/xdjango-postgres-extra/)
|
|
101
|
+
[](https://pypi.org/project/xdjango-postgres-extra/)
|
|
102
|
+
[](https://docs.djangoproject.com/en/6.0/)
|
|
103
|
+
[](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
|
+
[](https://pypi.org/project/xdjango-postgres-extra/)
|
|
4
|
+
[](https://pypi.org/project/xdjango-postgres-extra/)
|
|
5
|
+
[](https://docs.djangoproject.com/en/6.0/)
|
|
6
|
+
[](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()
|
|
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
|
|
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
|
|
113
|
-
"twine
|
|
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
|
+
[](https://pypi.org/project/xdjango-postgres-extra/)
|
|
101
|
+
[](https://pypi.org/project/xdjango-postgres-extra/)
|
|
102
|
+
[](https://docs.djangoproject.com/en/6.0/)
|
|
103
|
+
[](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
|
|
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
|
|
42
|
-
twine
|
|
41
|
+
build<2.0.0,>=1.2.0
|
|
42
|
+
twine<7.0.0,>=6.0.0
|
|
43
43
|
|
|
44
44
|
[test]
|
|
45
45
|
|