你如何在Rails中定义postgres函数以及它们的范围和生命周期是什么?

我对Postgresfunction一无所知,但是最近需要使用它们(这可能表明我正在接近问题,但无论如何……)

我想定义一个这样的Postgres函数,然后我将通过我的Rails应用程序中的查询访问:

CREATE FUNCTION date_in_time_zone(time_zone) RETURNS date AS 'SELECT DATE(NOW() AT TIME ZONE time_zone);' LANGUAGE SQL; 

(来自这个问题 )。

问题第1部分:如何定义此function?

我认为我会按如下方式这样做:

 sql = "CREATE FUNCTION date_in_time_zone(time_zone) RETURNS date AS 'SELECT DATE(NOW() AT TIME ZONE time_zone);' LANGUAGE SQL;" ActiveRecord::Base.connection.execute sql 

它是否正确?

问题第2部分:该function的范围和寿命是多少?

一旦定义,此function持续多长时间以及管理该function的版本控制的最佳方式是什么。 如果它是在数据库而不是Rails中定义的那么我将不得不小心销毁它或更新它,如果我想改变它的工作方式。 每次加载Rails环境时,我还需要一些初始化函数的方法。

我应该在初始化应用程序时创建一次该函数,还是需要为每个Web请求创建它? 我认为前者是在数据库中定义的,但我不确定。

问题第3部分:我是否应该使用这种方法?

这只是一个坏主意吗? 我应该尝试以不同的方式解决问题吗? 我真的不知道这些function的范围或寿命是多少。

一旦创建,PostgreSQL中的函数将永久保留 。 与其他对象一样,它位于模式中,只有在此模式位于当前会话的search_path中时才会找到。

在通用数据库中,您将在默认架构 public创建函数。 在更复杂的设置中,您可能拥有专用的function模式或每个用户的专用模式。 search_path将相应地设置。

使用CREATE OR REPLACE FUNCTION ...而不仅仅是CREATE FUNCTION ...这样你就可以替换现有函数的主体(不改变IN或OUT类型)。 更多关于@Pavel Stehule在dba.SE上的回答 。

请注意时区名称缩写或数字偏移的略有不同的影响。 相关问题/答案:
应用于时间戳时,具有相同属性的时区名称会产生不同的结果
PostgreSQL – 如何在不同的时区呈现日期?