gpt4 book ai didi

ruby-on-rails - 您如何在 Rails 中定义 postgres 函数,它们的作用域和生命周期是什么?

转载 作者:行者123 更新时间:2023-11-29 13:32:30 24 4
gpt4 key购买 nike

我对 Postgres 函数一无所知,但是最近有几次需要使用它们(这可能表明我处理问题的方式不正确,但无论如何......)

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

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

(来自 this question )。

问题第 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 中时才会找到它。您当前 session 的(并且没有被不同架构中相同的另一个功能隐藏)。

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

使用CREATE OR REPLACE FUNCTION ...而不仅仅是 CREATE FUNCTION ... 这样您就可以替换现有函数的主体(无需更改参数)。最近相关answer by @Pavel Stehule on dba.SE .

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

关于ruby-on-rails - 您如何在 Rails 中定义 postgres 函数,它们的作用域和生命周期是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com