使用UPSERT函数

时间:2017-05-17 10:02:41

标签: postgresql jdbc logstash

我正在使用this插件作为我的logstash日志的输出。

我需要使用upsert函数来检查行是否存在然后更新,如果它不存在则只需添加。

我正在使用PostgreSQL作为db,它支持使用UPSERT,非常好描述here。作为输入,日志来自elasticsearch。

我的配置问题是我在表格中正确添加了新行但无法更新现有行。

这是我的配置:

jdbc {
        driver_jar_path => '/home/vittorio/Downloads/postgresql-42.1.1.jre6.jar'
        connection_test => false
        connection_string => 'jdbc:postgresql://127.0.0.1:5432/postgres'
statement => ["

        INSERT INTO userstate VALUES(?,?,?,?,?) on conflict (username)
        do update set (business_name, iban, status, timestamp) = ('%{[resource][response_attributes][business_name]}','%{[resource][response_attributes][iban]}','%{[resource][response_attributes][status]}','%{@timestamp}')
        where userstate.username = '%{[request][username]}';", "%{[request][username]}","%{[resource][response_attributes][business_name]}","%{[resource][response_attributes][iban]}","%{[resource][response_attributes][status]}","%{@timestamp}"
        ]
 username => "myuser"
 password => "mypass"
}

我做错了吗? 感谢

1 个答案:

答案 0 :(得分:0)

我为自己的工作而努力,这就是我到目前为止所做的:

  jdbc {
          driver_jar_path => '/home/vittorio/Downloads/postgresql-42.1.1.jre6.jar'
          connection_test => false
          connection_string => 'jdbc:postgresql://127.0.0.1:5432/postgres'
          statement => ["

          INSERT INTO userstate VALUES(?,?,?,?,?)
          on conflict (username)
          do update set (business_name, iban, status, timestamp) = (?,?,?,?)
          where userstate.username = ?"
          , "%{[request][username]}","%{[resource][response_attributes][business_name]}","%{[resource][response_attributes][iban]}","%{[resource][response_attributes][status]}","%{@timestamp}","%{[resource][response_attributes][business_name]}","%{[resource][response_attributes][iban]}","%{[resource][response_attributes][status]}","%{@timestamp}","%{[request][username]}"

          ]
          username => "myusername"
          password => "mypass"

      }

基本上,我使用where而不是?更改了%{[request][username]}语句,然后使用日志中的相应值映射每个?。我知道,在昏迷之后这是相当长的东西,但这是我发现让它发挥作用的唯一方法。如果有人知道更好的方法,请告诉我。

谢谢