Postgresql запуск TRIGGER перед вставкой или обновлением нескольких столбцов в одном запросе - PullRequest
0 голосов
/ 08 апреля 2020
from django.db import models
from django.contrib.postgres.search import SearchVectorField
from django.contrib.postgres.indexes import GinIndex

class Page(models.Model):
    title = models.CharField(max_length=100, unique=True)
    content = models.TextField()

    # New modifications. A field and an index
    content_search = SearchVectorField(null=True)

    class Meta:
        indexes = [GinIndex(fields=["content_search"])]
  • Пользовательский файл миграции для создания события триггера для базы данных postgres.
from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        # NOTE: The previous migration probably looks different for you, so
        # modify this.
        ('web', '0002_auto_20190524_0957'),
    ]

    migration = '''
        CREATE TRIGGER content_search_update BEFORE INSERT OR UPDATE
        ON web_page FOR EACH ROW EXECUTE FUNCTION
        tsvector_update_trigger(content_search, 'pg_catalog.english', content);

        -- Force triggers to run and populate the text_search column.
        UPDATE web_page set ID = ID;
    '''

    reverse_migration = '''
        DROP TRIGGER content_search ON web_page;
    '''

    operations = [
        migrations.RunSQL(migration, reverse_migration)
    ]
  • Триггер, который работает только для одного поля столбца content_search всякий раз, когда Page таблица get обновляется.

  • Как создать событие триггера для обоих следующих нескольких столбцов в одном огне

class Page(models.Model):
    title = models.CharField(max_length=100, unique=True)
    content = models.TextField()

    content_search = SearchVectorField(null=True)
    title_search = SearchVectorField(null=True)

    class Meta:
        indexes = [GinIndex(fields=["content_search","title_search"]),]
...