Plugin for django to support Materialized Views
Project description
Materialized View support for the Django framework. Django (in general) does not support materialized views by the default
therefor migrations are not created automatically with ./manage.py makemigrations
.
This library provides new manage.py
command: ./manage.py migrate_with_views
.
This command is to be used instead of the default one migrate
.
This command automatically finds your materialized view models and keeps them up to date.
In case when materialized view is a parent view for another materialized view, use migrate_with_views
command
in order to change query of parent materialized view.
migrate_with_views
command finds all related materialized views and recreates them sequentially.
Contents
Requirements
django-materialized-view has been tested with:
- Django: 4.0, 4.1
- Python: 3.9, 3.10, 3.11
- Postgres >= 13
Installation
Via pip into a virtualenv
:
pip install django-materialized-view
In settings.py
add the following:
INSTALLED_APPS = (
...
'django_materialized_view'
)
Before running migrate:
python manage.py migrate
Then you can use new migrate command instead of the default one:
python manage.py migrate_with_views
This command will automatically begin interception of materialized view models, and proceed to create/delete/update your view on your DB if required.
Usage
-
Create class and inherit from
MaterializedViewModel
EXAMPLE:
from django.db import models from django_materialized_view.base_model import MaterializedViewModel class MyViewModel(MaterializedViewModel): create_pkey_index = True # if you need add unique field as a primary key and create indexes class Meta: managed = False # if create_pkey_index=True you must add argument primary_key=True item = models.OneToOneField("app.ItemModel", on_delete=models.DO_NOTHING, primary_key=True, db_column="id") from_seconds = models.IntegerField() to_seconds = models.IntegerField() type = models.CharField(max_length=255) # ATTENTION: this method must be a staticmethod or classmethod @staticmethod def get_query_from_queryset(): # define this method only in case use queryset as a query for materialized view. # Method must return Queryset pass
-
Add materialized view query (You can create a materialized view either from Raw SQL or from a queryset)
-
Create materialized view from Raw SQL
- run django default
makemigrations
command for creating model migrations if necessary:./manage.py makemigrations
- run
migrate_with_views
command for getting your new sql file name and path:./manage.py migrate_with_views
- you will get file path in your console
[Errno 2] No such file or directory: '.../app/models/materialized_views/sql_files/myviewmodel.sql' - please create SQL file and put it to this directory
- create file on suggested path with suggested name
- run again django command
migrate_with_views
:
this command will run the default./manage.py migrate_with_views
migrate
command and apply materialized views
- run django default
-
Create materialized view query from Queryset
- run django default
makemigrations
command for creating model migrations if necessary:./manage.py makemigrations
- add to your materialized view model the method
get_query_from_queryset
:# ATTENTION: this method must be a staticmethod or classmethod @staticmethod def get_query_from_queryset(): return SomeModel.objects.all()
- run django command
migrate_with_views
:
This command will run default./manage.py migrate_with_views
migrate
command and apply materialized views
- run django default
-
-
Use
refresh
method to update materialized view data.- For updating concurrently:
MyViewModel.refresh()
- For updating non-concurrently:
MyViewModel.refresh(concurrently=Fasle)
Note: All refreshes will be logged in to the model MaterializedViewRefreshLog:
class MaterializedViewRefreshLog(models.Model): updated_at = models.DateTimeField(auto_now_add=True, db_index=True) duration = models.DurationField(null=True) failed = models.BooleanField(default=False) view_name = models.CharField(max_length=255)
- For updating concurrently:
Development
-
Release CI triggered on tags. To release new version, create the release with new tag on GitHub
-
For integration with pytest add following fixture:
@pytest.fixture(scope="session") def django_db_setup(django_db_setup, django_db_blocker): with django_db_blocker.unblock(): view_processor = MaterializedViewsProcessor() view_processor.process_materialized_views()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django-materialized-view-0.1.6.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9a9e1ddae0ffb60d21c1340d8ef9e9ada646b5e080c1b6445d5c019a1990f694 |
|
MD5 | 8f90a166fa5774fc1e11bfe4b27ed909 |
|
BLAKE2b-256 | 5e55bd04b81258de665b5c78fa42cbf0f4426c5ef46045f3f7142b4614657128 |
Hashes for django_materialized_view-0.1.6.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7f749af3f893284215219c591c583b3a18299b6375c4547f0b142f68578eecca |
|
MD5 | 87ddf4663c12a97d372ffec029f6611c |
|
BLAKE2b-256 | 84b4e8983689b79d5a10dedb0c46a93204e047c432ae6a794d553fba6d428ea5 |