我正在处理YAML文件中的SQL查询。我已经在数据库中测试了SQL查询,效果很好。
这是我在Ansible文件中的查询:
shell: "{{ scrub_command }} -c \"UPDATE project_record SET meta=jsonb_set(meta, '{"email"}', concat('"', meta->>'email', '.not"')::jsonb) WHERE meta->>'email' IS NOT NULL AND meta->>'email' NOT ILIKE '%@email.somethingelse.com' AND meta->>'email' NOT ILIKE '%@something.com';\""
我看到在编辑器中,我的查询未正确结束,因为\"
的颜色与开头\"
的颜色不同)。
如果我取出零件:
concat('"', meta->>'email', '.not"')::jsonb)
查询正确关闭。
我曾尝试过使用该查询并在YAML皮棉网站中对其进行测试,但是我找不到我的YAML文件接受该查询的方法。
运行脚本时出现的错误是:
Syntax Error while loading YAML.\n expected <block end>, but found '<scalar>'
YAML皮棉网站会出现此错误:
did not find expected key while parsing a block mapping at line 1 column 1
我做错了什么?
答案 0 :(得分:0)
您的查询对YAML无效。您可以尝试:
shell: "{{ scrub_command }} -c \"UPDATE project_record SET meta=jsonb_set(meta, '{\"email\"}', concat('\"', meta->>'email', '.not\"')::jsonb) WHERE meta->>'email' IS NOT NULL AND meta->>'email' NOT ILIKE '%@email.somethingelse.com' AND meta->>'email' NOT ILIKE '%@something.com';\""
答案 1 :(得分:0)
将标有单引号和双引号的标量放入YAML的最佳方法是使用块样式标量。这是一个用|
或>
字符表示的标量。在块样式(|
中,标量中的所有字符都不会被解释,即使换行符也是换行符:
shell: |-
{{ scrub_command }} -c \"UPDATE project_record SET meta=jsonb_set(meta, '{"email"}', concat('"', meta->>'email', '.not"')::jsonb) WHERE meta->>'email' IS NOT NULL AND meta->>'email' NOT ILIKE '%@email.somethingelse.com' AND meta->>'email' NOT ILIKE '%@something.com';\"
在折叠样式中,单个换行符由空格代替,因此您可以使内容更具可读性:
shell: >-
{{ scrub_command }} -c \"UPDATE project_record
SET meta=jsonb_set(meta, '{"email"}', concat('"', meta->>'email', '.not"')::jsonb)
WHERE meta->>'email' IS NOT NULL AND meta->>'email' NOT ILIKE '%@email.somethingelse.com' AND meta->>'email'
NOT ILIKE '%@something.com';\"
第二行中的第二行应完全相同(包括在这些块样式YAML标量中没有特殊含义的反斜杠,但是对于执行从标量加载的字符串的外壳来说当然是这样)。
-
之后的|
。 >
是摆脱尾随换行符所必需的。