【问题标题】:django.db.utils.ProgrammingError: syntax error at or near "FUNCTION"django.db.utils.ProgrammingError:“FUNCTION”处或附近的语法错误
【发布时间】:2020-05-02 09:14:34
【问题描述】:

我正在关注Optimizing Full Text Search in Django 的文章,文章在某些时候说:

为了添加触发器,我们需要制作手动 Django 迁移。 这将添加触发器功能并将我们所有的 Pages 行更新为 确保触发触发器并且 content_search 填充在 我们现有记录的迁移时间。

from django.db import migrations
class Migration(migrations.Migration):
    dependencies = [
        ('web', '0002_auto_20200115_1401')
    ]
    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)]

当我运行迁移时出现此错误:

django.db.utils.ProgrammingError:“FUNCTION”处或附近的语法错误

我的settings.py 与教程文章的一个区别是它使用django.db.backends.postgresql 作为数据库引擎,而我使用django.db.backends.postgresql_psycopg2 这里可能是什么问题,更重要的是我该如何解决这个问题? 提前致谢。

【问题讨论】:

    标签: python django postgresql search


    【解决方案1】:

    我认为您需要使用PROCEDURE 而不是FUNCTION

    from django.db import migrations
    class Migration(migrations.Migration):
        dependencies = [
            ('web', '0002_auto_20200115_1401')
        ]
        migration = '''
            CREATE TRIGGER content_search_update BEFORE INSERT OR UPDATE
            ON web_page FOR EACH ROW EXECUTE PROCEDURE
            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)]
    

    【讨论】:

    • 那行得通。非常感谢。这是因为数据库引擎的不同吗?特定于 psycopg2-binary?我会在 10 分钟内接受这个答案。
    • 不。我搜索了如何在 postgres 中创建触发器,您使用 CREATE FUNCTION 创建函数,但 EXECUTE PROCEDURE 将该函数作为触发器的一部分调用。这纯粹是一个 postgres 语法问题。
    猜你喜欢
    • 2019-09-08
    • 2018-01-26
    • 2014-04-26
    • 1970-01-01
    • 2017-02-20
    • 2013-09-10
    • 2017-06-10
    • 2015-02-23
    • 1970-01-01
    相关资源
    最近更新 更多