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

2024-03-31

我对 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(使用前将#替换为@)

如何在 Rails 中定义 postgres 函数以及它们的范围和生命周期是什么? 的相关文章

  • 如何将本机数据库运算符 (postgres ~) 与 JPA 标准生成器一起使用?

    我使用 JPA 2 0 标准构建以下查询 简化 select n from notif n where n message b la 我正在使用 postgresql 数据库 我真的需要 运算符 而不是像 我可以使用与 CriteriaBu
  • Rails:验证字符串的最小和最大长度,但允许其为空白

    我有一个想要验证的字段 我希望该字段能够留空 但如果用户输入数据 我希望它采用某种格式 目前我在模型中使用以下验证 但这不允许用户将其留空 validates length of foo maximum gt 5 validates len
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 将 CSV 复制到 Amazon RDS 托管的 Postgresql 数据库

    我有一个使用 Amazon 的 RDS 服务托管的数据库 我正在尝试编写一个 Web 服务来更新所述数据库 我遇到的问题是它不允许我使用 COPY 命令 因为我收到此错误 错误 必须是超级用户才能复制到文件或从文件复制 我正在使用我为数据库
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si
  • PostgreSQL 如何对字段上的 b 树索引执行 ORDER BY?

    我有一张桌子bsort CREATE TABLE bsort a int data text Here data可能不完整 换句话说 某些元组可能没有data value 然后我在表上建立一个 B 树索引 CREATE INDEX ON b
  • Capistrano 部署擦除数据库?

    我已成功使用 Capistrano 将我的应用程序部署到生产环境 但我不明白如何处理我的数据库 我正在使用颠覆和乘客 当我运行 cap 部署时 新部署会重新启动一切 它会清除添加到数据库中的数据 显然 必须有一个解决方案 但我很惊讶没有在网
  • 如何将 CarrierWave 文件迁移到新的存储机制?

    我有一个 Ruby on Rails 站点 其中包含使用 CarrierWave 进行文件处理的模型 当前使用本地存储 我想开始使用云存储 并且需要将现有的本地文件迁移到云端 我想知道是否有人可以指出这样做的方法 使用模型属性的好处是 它允
  • Rails 5 - 在 gem 上充当 Taggable - 简单表单集合选择已定义的标签列表

    我正在尝试学习如何将 Acts as Taggable On gem 与 Rails 5 一起使用 我使用简单的表格作为表格 我认为部分问题是由于提案和 randd fields 之间的模型没有关联而产生的 我有名为 Proposal 和
  • 为 Ruby On Rails 环境创建 Docker 映像时出错(从 Dockerfile)

    估计是环境问题 当我手动执行此操作 没有 Dockerfile 时 它可以工作 这是我的 Dockerfile FROM ubuntu 14 04 RUN apt get update RUN apt get upgrade assume
  • UNIX时间记录时区吗?

    我想问一下UNIX时间 UNIX时间是否记录时区 我将托管从美国芝加哥移至 JST 问题是我的整个 MySQL 数据库都有 UNIX 时间 芝加哥 美国时区 的记录 我有一个 PHP 代码来显示之前的时间 例如 3 天前 昨天等 当我搬到新
  • Rails API 设计无需禁用 CSRF 保护

    早在 2011 年 2 月 Rails 就改为需要 CSRF 令牌all non GET http weblog rubyonrails org 2011 2 8 csrf protection bypass in ruby on rail
  • Rails 急切加载计数?

    使用 include 属性可以很好地进行预加载 Post find all include gt author 我想知道您是否也可以急切加载计数 例如我是否想获取每个帖子的评论数量 而不加载所有评论本身 也许像 Post find all
  • 未签出...捆绑安装无法修复帮助!

    https github com intridea omniauth git at master is not checked out Please run bundle install Bundler GitError 那我该怎么办 捆绑
  • 默认更新嵌套属性

    我尝试更新 iProduction 这是生产中的嵌套表单 但此行出现参数错误 参数数量错误 0 代表 1 生产 update iproducts attributes cow id cow 我的创作动作制作 def create produ
  • 将 Google CloudSQL Postgres 数据库连接到 Data Studio

    我正在尝试将托管在 google Cloud Sql 实例中的 Postgres 数据库连接到 Data Studio 我已按照说明进行操作 在此处找到https support google com datastudio answer 7
  • 使用ajax轮询服务器

    我正在建立一个网站 该网站有一个用户可以互相发送消息的系统 我希望这样当登录用户收到消息时 他会在屏幕上看到一些更新告诉他这一点 这些消息不必是实时的 所以我认为我不想用彗星或主宰之类的东西来推动 相反 我很乐意每隔一分钟左右轮询一次服务器
  • 我可以从安装 Rails 引擎的真实应用程序运行它的规格吗?

    我有一个 Rails 引擎 旨在为我们的一个更大的项目提供一些模型和控制器 引擎有一套相当不错的规格 在引擎的虚拟应用程序中使用了一堆模拟和一些全尺寸模型和控制器 以确保引擎正在做它应该做的事情并与更大的应用程序一起工作 然而 即使所有测试
  • 在 Rails 5.1 及更高版本中,使用什么来代替“render :text”(和“render Nothing: true”)?

    轨道 5 1 其中就有老朋友render text 当你需要渲染的时候它非常有用some文本 但不想要视图模板的开销 例子 render text ok render text t business rules project access
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行

随机推荐