我正在尝试使用bash脚本更新我的一个表中的字段。我正在尝试将json值插入到postgress中的这个字段中。字段类型为“text”。下面是我尝试执行的查询:
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我试过所有的方法来避免引用,但都不起作用。
有没有人能帮我解决这个问题?
发布于 2021-09-21 05:16:57
我没有尝试添加JSON对象,但这里是使用kubectl创建和插入的工作语法。最好的方法是将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');\""发布于 2021-09-21 05:42:00
基本问题是,psql -c后面的字符串应该作为单参数引用,但您已经在其中使用了单引号和双引号,因此尝试添加更多引号是不够的。
因为您不能轻松地在单引号中转义单引号,所以最简单的解决方案可能是在字符串两边添加双引号,并对其中任何现有的双引号进行反斜杠转义。
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 keycloak前面添加printf '%s\\n',让容器简单地打印出结果。我想您可能需要更多关于JSON字符串的引号,但我对psql还不够熟悉,无法猜测它应该是什么样子。此外,围绕$TOKEN的引用看起来是错误的(将$ENV_TOKEN复制到一个新的完全相同的变量中似乎没有任何意义,而您根本不需要更改该变量)。
如果kubectl exec -it postgres-d5b5794-7fxxm -n eclipse-che -- bash允许你从标准输入中读取(不是在我可以检查的地方),你也许可以使用一个here文档:
kubectl exec -it postgres-d5b5794-7fxxm -n eclipse-che -- bash <<____
psql keycloak -c "UPDATE federated_identity SET token ={\"access_token\":\"'$TOKEN'\",\"expires_in\":86400,\"scope\":\"user:full\",\"token_type\":\"Bearer\"} WHERE federated_username = 'admin';"
____再一次,我不得不猜测一些事情。如果您不能让它工作,也许可以更新您的问题,以更详细地解释代码预期的功能。
https://stackoverflow.com/questions/66145749
复制相似问题