首页 > 解决方案 > 使用 kubectl 通过 bash 脚本在 postgres 中插入 json

问题描述

我正在尝试使用 bash 脚本更新我的一个表中的字段。我正在尝试在 postgress 的该字段中插入 json 值。字段类型为“文本”。这是我尝试执行的查询:

TOKEN="${ENV_TOKEN}"
kubectl exec -it postgres-d5b5794-7fxxm -n eclipse-che -- bash -c "psql keycloak -c UPDATE federated_identity SET token ={"access_token":"'$TOKEN'","expires_in":86400,"scope":"user:full","token_type":"Bearer"}  WHERE federated_username = 'admin'"

执行此代码后,我收到以下错误:

psql: warning: extra command-line argument "SET" ignored
psql: warning: extra command-line argument "token" ignored
psql: warning: extra command-line argument "=access_token:sha256~g1KaHT3-RSa2G1oPfDboc7jI90OLy67VQ4mJsVjFYZw" ignored
psql: warning: extra command-line argument "=expires_in:86400" ignored
psql: warning: extra command-line argument "=scope:user:full" ignored
psql: warning: extra command-line argument "=token_type:Bearer" ignored
psql: warning: extra command-line argument "WHERE" ignored
psql: warning: extra command-line argument "federated_username" ignored
psql: warning: extra command-line argument "=" ignored
psql: warning: extra command-line argument "admin" ignored
psql: FATAL:  role "federated_identity" does not exist
command terminated with exit code 2

我已经尝试了一切来避免引号,但没有任何效果......

有人可以帮我完成这个查询吗?

标签: bashpostgresql

解决方案


我没有尝试添加 JSON 对象,但这里是使用 kubectl 进行 CREATE 和 INSERT 的工作语法。最好的方法是将您的 SQL 语句放在文件中,以避免确保双引号/单引号被正确转义或不正确转义的痛苦。转义引号变得非常复杂,只有很少的值。我的建议是在所有 SQL 语句中使用 *.sql 文件。

使用 kubectl 执行 SQL 文件

kubectl exec -i <pod-name> -- bash -c "psql -U postgres -f /tmp/create.sql"

创建表

kubectl exec -i <pod-name> -- bash -c "psql -U postgres -c \"CREATE TABLE account1 (user_id INT PRIMARY KEY, username VARCHAR(50) NOT NULL, Password VARCHAR(50) NOT NULL, email VARCHAR(255) NOT NULL);\""

向表中插入记录

kubectl exec -i <pod-name> -- bash -c "psql -U postgres -c \"INSERT INTO account1 VALUES (1, 'dummyuser', 'dummypassword', 'dummy@gmail.com');\""

推荐阅读