我对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 - 如何在不同的时区渲染日期?