xdjango-postgres-extra 2.1.1__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.1 → xdjango_postgres_extra-2.1.2}/setup.py +1 -1
- xdjango_postgres_extra-2.1.2/xdjango_postgres_extra.egg-info/PKG-INFO +208 -0
- xdjango_postgres_extra-2.1.1/PKG-INFO +0 -206
- xdjango_postgres_extra-2.1.1/README.md +0 -112
- xdjango_postgres_extra-2.1.1/psqlextra/_version.py +0 -1
- xdjango_postgres_extra-2.1.1/xdjango_postgres_extra.egg-info/PKG-INFO +0 -206
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/LICENSE +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/apps.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/base.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/base_impl.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/introspection.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_default_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_hash_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_list_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/add_range_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/apply_state.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_materialized_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_partitioned_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/create_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_default_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_hash_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_list_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_materialized_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_partitioned_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_range_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/delete_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/operations/partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_autodetector.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_migrations.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/patched_project_state.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/materialized_view.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/partitioning.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/migrations/state/view.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/operations.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/schema.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/hstore_required.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/backend/side_effects/hstore_unique.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/compiler.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/expressions.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/model_data_migrator.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/static_row.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/contrib/transaction.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/error.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/expressions.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/fields/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/fields/hstore_field.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/case_insensitive_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/conditional_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/indexes/unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/fields.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/introspect/models.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/locking.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/lookups.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/management/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgmakemigrations.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgpartition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/management/commands/pgrefreshmv.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/manager/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/manager/manager.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/models/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/models/base.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/models/options.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/models/partitioned.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/models/view.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/__init__.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/config.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/constants.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/current_time_strategy.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/error.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/manager.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/plan.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/range_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/range_strategy.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/shorthands.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/strategy.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_partition_size.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/partitioning/time_strategy.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/py.typed +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/query.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/schema.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/settings.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/sql.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/type_assertions.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/types.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/psqlextra/util.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/pyproject.toml +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/setup.cfg +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_append_caller_to_sql.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_case_insensitive_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_conditional_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_db_backend.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_django_6_compatibility.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_autodetect.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_field.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_required.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_hstore_unique.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_insert.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_introspect.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_locking.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_lookups.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_make_migrations.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_management_command_partition.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_manager.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_manager_context.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_materialized_view_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_migration_operations.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict_nothing.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_on_conflict_update.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_partitioned_model.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_partitioned_model_state.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_partitioning_manager.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_partitioning_time.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_query.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_query_values.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_schema.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_alter_schema.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_clone_model_to_schema.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_partitioning.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_storage_settings.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_vacuum.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_schema_editor_view.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_settings.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_unique_index.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_upsert.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/tests/test_view_models.py +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/SOURCES.txt +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/dependency_links.txt +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/requires.txt +0 -0
- {xdjango_postgres_extra-2.1.1 → xdjango_postgres_extra-2.1.2}/xdjango_postgres_extra.egg-info/top_level.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"
|
|
@@ -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).
|