Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何确定复制的行数?_Ruby_Postgresql_Pg_Rowcount_Postgresql Copy - Fatal编程技术网

Ruby 如何确定复制的行数?

Ruby 如何确定复制的行数?,ruby,postgresql,pg,rowcount,postgresql-copy,Ruby,Postgresql,Pg,Rowcount,Postgresql Copy,我正在运行Postgres DB,并使用ruby中的COPY命令将数据加载到临时表中 它看起来像这样: @conn = PG.connect(dbname: 'load_test') res = @conn.async_exec <<-QUERY COPY tmp_inventory FROM '#{infile_location}' CSV HEADER DELIMITER '|' QUERY @conn=PG.connect(数据库名:“负载测试”) res=@conn.a

我正在运行Postgres DB,并使用ruby中的
COPY
命令将数据加载到临时表中

它看起来像这样:

@conn = PG.connect(dbname: 'load_test')
res = @conn.async_exec <<-QUERY
  COPY tmp_inventory FROM '#{infile_location}' CSV HEADER DELIMITER '|'
QUERY
@conn=PG.connect(数据库名:“负载测试”)

res=@conn.async_exec您可以在Postgres中执行此操作,也可以直接从Ruby中的Postgres接口获取:

使用Ruby 更具体地说是课堂

我不是Ruby专家,但研究文档,而且似乎方法
cmd_tuples
只适用于
INSERT | DELETE | UPDATE | MOVE | FETCH

还有常数
PGRES\u COPY\u OUT
PGRES\u COPY\u IN
(针对当前案例)。似乎:

返回查询的状态。状态值为以下值之一:

PGRES_EMPTY_QUERY
PGRES_COMMAND_OK
PGRES_TUPLES_OK
PGRES_COPY_OUT
PGRES_COPY_IN
PGRES_BAD_RESPONSE
PGRES_NONFATAL_ERROR
PGRES_FATAL_ERROR
PGRES_COPY_BOTH
因此,在您的示例中,您应该通过以下方式获得所需的值:

res.result_status
使用Postgres 您可以使用PL/pgSQL函数以编程方式访问
COPY
处理的行数(需要9.2+版本):


    • 埃尔文·布兰德施泰特走上了正确的道路。尽管Ruby API文档目前说(它需要更新),
      PG::Result#cmd_tuples
      至少在PostgreSQL 9.6.3中可以使用
      COPY
      命令。当被问到这个问题时,它可能没有,但现在包含了
      COPY
      ,因此我将更新Ruby API的文档以反映这一点

      这是的一个修改版本,它使用
      PG::Connection#copy_data
      包装方法围绕
      libpq
      copy
      API:

      require 'pg'
      require 'stringio'
      
      $stderr.puts "Opening database connection ..."
      conn = PG.connect( dbname: 'test' )
      
      conn.exec( <<END_SQL )
      DROP TABLE IF EXISTS logs;
      CREATE TABLE logs (
          client_ip inet,
          username text,
          ts timestamp,
          request text,
          status smallint,
          bytes int
      );
      END_SQL
      
      csv_io = StringIO.new( <<"END_DATA" )
      "127.0.0.1","","30/Aug/2010:08:21:24 -0700","GET /manual/ HTTP/1.1",404,205
      "127.0.0.1","","30/Aug/2010:08:21:24 -0700","GET /favicon.ico HTTP/1.1",404,209
      "127.0.0.1","","30/Aug/2010:08:21:24 -0700","GET /favicon.ico HTTP/1.1",404,209
      "127.0.0.1","","30/Aug/2010:08:22:29 -0700","GET /manual/ HTTP/1.1",200,11094
      "127.0.0.1","","30/Aug/2010:08:22:38 -0700","GET /manual/index.html HTTP/1.1",200,725
      "127.0.0.1","","30/Aug/2010:08:27:56 -0700","GET /manual/ HTTP/1.1",200,11094
      "127.0.0.1","","30/Aug/2010:08:27:57 -0700","GET /manual/ HTTP/1.1",200,11094
      "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/index.html HTTP/1.1",200,7709
      "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/images/feather.gif HTTP/1.1",200,6471
      "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/images/left.gif HTTP/1.1",200,60
      "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/style/css/manual.css HTTP/1.1",200,18674
      "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/style/css/manual-print.css HTTP/1.1",200,13200
      "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/images/favicon.ico HTTP/1.1",200,1078
      "127.0.0.1","","30/Aug/2010:08:28:06 -0700","GET /manual/style/css/manual-loose-100pc.css HTTP/1.1",200,3065
      "127.0.0.1","","30/Aug/2010:08:28:14 -0700","OPTIONS * HTTP/1.0",200,0
      "127.0.0.1","","30/Aug/2010:08:28:15 -0700","OPTIONS * HTTP/1.0",200,0
      "127.0.0.1","","30/Aug/2010:08:28:47 -0700","GET /manual/mod/directives.html HTTP/1.1",200,33561
      "127.0.0.1","","30/Aug/2010:08:28:53 -0700","GET /manual/mod/mpm_common.html HTTP/1.1",200,67683
      "127.0.0.1","","30/Aug/2010:08:28:53 -0700","GET /manual/images/down.gif HTTP/1.1",200,56
      "127.0.0.1","","30/Aug/2010:08:28:53 -0700","GET /manual/images/up.gif HTTP/1.1",200,57
      "127.0.0.1","","30/Aug/2010:09:19:58 -0700","GET /manual/mod/mod_log_config.html HTTP/1.1",200,28307
      "127.0.0.1","","30/Aug/2010:09:20:19 -0700","GET /manual/mod/core.html HTTP/1.1",200,194144
      "127.0.0.1","","30/Aug/2010:16:02:56 -0700","GET /manual/ HTTP/1.1",200,11094
      "127.0.0.1","","30/Aug/2010:16:03:00 -0700","GET /manual/ HTTP/1.1",200,11094
      "127.0.0.1","","30/Aug/2010:16:06:16 -0700","GET /manual/mod/mod_dir.html HTTP/1.1",200,10583
      "127.0.0.1","","30/Aug/2010:16:06:44 -0700","GET /manual/ HTTP/1.1",200,7709
      END_DATA
      
      ### You can test the error case from the database side easily by
      ### changing one of the numbers at the end of one of the above rows to
      ### something non-numeric like "-".
      
      $stderr.puts "Running COPY command with data ..."
      buf = ''
      conn.transaction do
          res = conn.copy_data( "COPY logs FROM STDIN WITH csv" ) do
              $stderr.print "Sending lines... "
              csv_io.each_line.with_index do |buf, i|
                  $stderr.print "#{i + 1} "
                  conn.put_copy_data( buf )
              end
              $stderr.puts "done."
          end
          $stderr.puts "Result of COPY is: %s" % [ res.res_status(res.result_status) ]
          $stderr.puts "  tuples copied: %p" % [ res.cmd_tuples ]
      end
      
      conn.finish
      

      PG::Result#Result_status
      方法只返回一个整数结果状态代码,而
      PGRES_COPY_OUT
      /
      PGRES_COPY_IN
      被低级
      COPY
      API使用,因此它们在正常情况下不是很有用。

      @Erwin Brandstetter:你能帮助我理解在Ruby上下文中如何做到这一点吗?如果我理解正确,链接的问题是关于PG CLI上的查询。我明白了。在Ruby上下文中执行它需要一种不同的方法。
      $ ruby sample/copyfrom.rb
      Opening database connection ...
      Running COPY command with data ...
      Sending lines... 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 done.
      Result of COPY is: PGRES_COMMAND_OK
        tuples copied: 26