【问题标题】:How to load custom sql functions with django如何使用 django 加载自定义 sql 函数
【发布时间】:2025-11-26 02:55:01
【问题描述】:

我正在尝试使用 Django 的初始 SQL 数据功能来创建 SQL 函数。文档说明我可以这样做:

https://docs.djangoproject.com/en/1.6/howto/initial-data/#providing-initial-sql-data

Django 提供了一个钩子,用于传递数据库任意 SQL,该 SQL 在您运行 migrate 时在 CREATE TABLE 语句之后执行。您可以使用此钩子填充默认记录,也可以创建 SQL 函数、视图、触发器等。

经过一番谷歌搜索后,我发现 django 的 customsql 代码会拆分任何 sql 文件并逐行运行它们,从而产生此错误,

未能为 myapp.somemodel 模型安装自定义 SQL:在“$$ BEGIN;”处或附近未终止的美元引号字符串

是否有可接受的解决方法?还是加载自定义 sql 函数的更好方法?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    是的,我以前见过这个问题。如果您在应用程序的 sql/.sql 中粘贴多行函数,如下所示:

    CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql;

    你会得到你看到的错误,比如:

    无法为 mysite.Poll 模型安装自定义 SQL:“$$ BEGIN RETURN i + 1;”处或附近未终止的美元引号字符串 LINE 1: ... FUNCTION increment(i integer) RETURNS integer AS $$ BEGIN R...

    我认为您应该能够通过将函数定义全部压缩到一行来解决该问题,例如

    CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql;

    看起来这个错误会影响任何多行函数(包括美元引号和单引号)。我在 Django 1.6 上测试过,不知道是否已经修复。

    【讨论】: