Skip to main content

处理数据库视图。允许为数据库视图创建迁移。使用 django 代码查看迁移。它们可以颠倒过来。自动检测模型视图定义的变化。支持几乎所有选项作为常规 makemigrations 命令

项目描述

django-db-views

:备忘录: 执照 执照
:包裹: 派皮 派皮
Django 版本 2.2 到 4.0
Python 版本 3.6 至 3.10

如何安装?

  • pip install django-db-views

我们提供什么

  • 数据库视图
  • 物化视图
  • 查看架构迁移
  • 物化视图的索引(未来)
  • 数据库表函数(未来)

如何使用?

  • 添加django_db_viewsINSTALLED_APPS
  • 使用makeviewmigrations命令为视图模型创建迁移

如何在数据库中创建视图?

  • 要使用 DBView 类创建视图,请记住设置视图定义属性。

     from django.db import models
     from django_db_views.db_view import DBView
     
     
     class VirtualCard(models.Model):
         ...
     
     
     class Balance(DBView):
    
         virtual_card = models.ForeignKey(
             VirtualCard,  # VirtualCard is a regular Django model. 
             on_delete=models.DO_NOTHING, related_name='virtual_cards'
         )
         total_discount = models.DecimalField(max_digits=12, decimal_places=2)
         total_returns = models.DecimalField(max_digits=12, decimal_places=2)
         balance = models.DecimalField(max_digits=12, decimal_places=2)
         
         view_definition = """
             SELECT
                 row_number() over () as id,  # Django requires column called id
                 virtual_card.id as virtual_card_id,
                 sum(...) as total_discount,
             ...
         """
     
         class Meta:
             managed = False  # Managed must be set to False!
             db_table = 'virtual_card_balance'
    
  • 视图定义可以是:str/dict或返回str/dict的可调用对象。

    可调用视图定义示例:

     from django_db_views.db_view import DBViewl
    
     class ExampleView(DBView):
         @staticmethod
         def view_definition():
             return str(SomeModel.objects.all().query)
         # OR
         view_definition = lambda: str(SomeModel.objects.all().query)
         class Meta:
             managed = False 
             db_table = 'example_view'
    

    使用 callable 允许您使用 ORM 编写视图定义。

  • 确保包含managed = False在 DBView 模型的 Meta 类中,以防止 Django 创建它自己的迁移。

视图迁移如何工作?

  • DBView 作为常规 django 模型工作。您可以在任何查询中使用它。
  • 它使用 Django 代码,视图迁移看起来像常规迁移。
  • 它依赖于db_table名称。
  • makeviewmigrations命令查找以前的迁移以供查看。
    • 如果没有这样的迁移,则脚本创建一个新的迁移
    • 如果存在先前的迁移但未view_definition检测到任何更改,则不执行任何操作
    • 如果存在先前的迁移,则脚本将使用先前view_definition的进行向后操作,并创建新的迁移。
    • 运行时,它将检查 django.settings 中定义的当前默认引擎是否与定义视图的引擎相同

多数据库支持

Yoy 可以将 view_definition 定义为多种引擎类型的字典。

如果你没有传入一个引擎并且有一个 str 或 callable 引擎将被默认为 django 中定义的默认数据库。

它尊重 migrate 命令中的 --database 标志,因此您可以使用引擎键为特定数据库定义特定的视图定义。如果键与您当前的数据库不匹配,将跳过视图迁移。

此外,如果您为本地/开发/登台/生产使用不同的引擎,该功能将变得有用。

示例字典视图定义:

view_definition = {
    "django.db.backends.sqlite3": """
        SELECT
            row_number() over () as id,
            q.id as question_id,
            count(*) as total_choices
        FROM question q
        JOIN choice c on c.question_id = q.id
        GROUP BY q.id
    """,
    "django.db.backends.postgresql": """
        SELECT
            row_number() over () as id,
            q.id as question_id,
            count(*) as total_choices
        FROM question q
        JOIN choice c on c.question_id = q.id
        GROUP BY q.id
    """,
}

物化视图

只是继承DBMaterializedView而不是常规DBView

Materialzied View 提供了一个额外的类方法来刷新视图,称为refresh

笔记

请使用最新版本。0.1.0 版本具有向后不兼容性,这在 0.1.1 及更高版本中得到解决。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django-db-views-0.1.3.tar.gz (17.2 kB 图哈希)

已上传 source

内置分布

django_db_views-0.1.3-py3-none-any.whl (21.7 kB 查看哈希)

已上传 py3