【问题标题】:Can psql commands be executed from Rails application可以从 Rails 应用程序执行 psql 命令吗
【发布时间】:2020-01-08 04:14:17
【问题描述】:

我想知道是否从应用程序执行 psql 命令? 例如,我想利用 psql 提供的 \crosstabview 功能。这是查看报告时的一项很棒的功能。

我有一个使用 Ruby on Rails 的应用程序。我正在考虑是否可以从应用程序运行 \crosstabview。

【问题讨论】:

  • 您可以使用ActiveRecord::Base.connection.execute(...) 执行命令。但是,我不知道执行\crosstabview 是否有效。
  • RocKhalil - 感谢您的评论。不,它不适用于 ActiveRecord::Base.connection.execute(...)

标签: ruby-on-rails ruby postgresql psql


【解决方案1】:

这些只是 psql 应用程序的功能。无法通过数据库驱动程序使用它们,无论是 ActiveRecord 还是其他任何东西。那只是另一回事。

但是,您可以使用例如table_view gem 来获得表格视图。

【讨论】:

    【解决方案2】:

    可以从 Rails 应用程序执行 psql 命令吗?

    理论上可以通过从 ruby​​ 运行 psql 来完成。它只是一个非常笨拙的解决方案。

    psql --command 选项仅采用单个函数名或可由数据库解析且不能使用 psql 特定函数的 SQL 字符串。这意味着您可以运行例如%x{ psql --command "\\h"},但不能运行需要输入的\crosstableview

    剩下的就是使用PTY 打开一个交互式会话。

    # example using PTY to connect to an interactive psql shell
    require 'pty'
    require 'expect'
    
    PTY.spawn('psql') do |output, input, pid|
      output.expect /\=\#/ do
        input.puts '\\conninfo'
        output.each do |line|
          puts line
        end
      end
    end
    

    虽然可能有更好的解决方案 - 使用 tablefunc extension 中的 crosstab 函数,该函数可与 ActiveRecord::Base.connection.execute 一起使用。

    【讨论】:

    • 我对交叉表的限制使我使用了交叉表视图。交叉表的限制是值字段在我的情况下是动态的。我没有预定义的水平标题列表。我将不得不考虑任何其他方法。正如其他用户建议的那样,可能类似于 gem。感谢您的评论。
    【解决方案3】:

    我设法通过 psql 提供的“\ir”选项来做到这一点。通过此选项,您可以运行写入文件中的命令。因此,请将您想在 CLI 中运行的所有命令放在一个文件中。

    现在您只需连接到 psql 并将文件名传递给 "\i" 选项。

    示例:我创建了一个文件“a.rb”,它包含以下内容-

    psql -h localhost -U postgres
    \ir filename
    

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      相关资源
      最近更新 更多