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



我对Postgres函数一无所知,但是最近出现了几次使用它们的需求(这可能表明我错误地处理了这个问题,但无论如何......

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

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

(从这个问题开始(。

问题部分 1:如何定义此函数?

我想我会这样做如下:

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 ...,以便可以替换现有函数的主体(无需更改参数(。@Pavel Stehule最近在 dba.SE 上的相关回答。

请注意时区名称缩写和数字偏移量的影响略有不同。相关:

  • 具有相同属性的时区名称在应用于时间戳时会产生不同的结果
  • PostgreSQL - 如何在不同的时区渲染日期?

相关内容

  • 没有找到相关文章

最新更新