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

How do you define postgres functions in Rails and what is their scope and lifetime?

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

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

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

(来自这个问题)。

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

我认为我会这样做:

1
2
3
4
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部分:这个功能的范围和寿命是多少?

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

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

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

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


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

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

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

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