我对 Postgres 函数一无所知,但是最近几次需要使用它们(这可能表明我错误地处理了这个问题,但无论如何......)
我想定义一个像这样的 Postgres 函数,然后我将通过 Rails 应用程序中的查询访问该函数:
CREATE FUNCTION date_in_time_zone(time_zone) RETURNS date AS
'SELECT DATE(NOW() AT TIME ZONE time_zone);'
LANGUAGE SQL;
(from 这个问题 https://stackoverflow.com/questions/20059342/whats-the-cleanest-way-to-get-the-current-local-time-in-postgres).
问题第 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 环境时,我还需要某种方法来初始化该函数。
我应该在应用程序初始化时创建该函数,还是需要为每个网络请求创建该函数?我认为前者是在数据库中定义的,但我不确定。
问题第 3 部分:我是否应该使用这种方法?
这只是一个坏主意吗?我应该尝试以不同的方式解决问题吗?我真的不知道这些函数的范围或生命周期是什么。
一旦创建,PostgreSQL中的函数就会被持久化永久。与其他对象一样,它存在于模式内。除非您对函数名称进行模式限定,否则仅当该模式位于search_path https://stackoverflow.com/a/9067777/939860您当前会话的(并且没有被不同模式中相同的另一个函数隐藏)。
在通用数据库中,您可以在默认情况下创建函数schema https://www.postgresql.org/docs/current/ddl-schemas.html public
,默认位于搜索路径中。在更复杂的设置中,您可能有一个专用的函数架构或每个用户的专用架构。这search_path
将进行相应设置。
Use CREATE OR REPLACE FUNCTION ... https://www.postgresql.org/docs/current/sql-createfunction.html而不是仅仅CREATE FUNCTION ...
因此您可以替换现有函数的主体(无需更改参数)。最近相关@Pavel Stehule 在 dba.SE 上的回答 https://dba.stackexchange.com/a/53784/3684.
注意时区略有不同的影响names, 缩写和数字偏移量。有关的:
- 具有相同属性的时区名称在应用于时间戳时会产生不同的结果 https://stackoverflow.com/questions/12042506/time-zone-names-with-identical-properties-yield-different-result-when-applied-to
- PostgreSQL - 如何呈现不同时区的日期? https://stackoverflow.com/questions/10797720/postgresql-how-to-render-date-in-different-time-zone
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)