错误-预期为<block end =“”>,但发现为'<scalar>'

时间:2018-11-23 15:46:50

标签: sql ansible yaml

我正在处理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 

我做错了什么?

2 个答案:

答案 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';\""

根据http://www.yamllint.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标量中没有特殊含义的反斜杠,但是对于执行从标量加载的字符串的外壳来说当然是这样)。

-之后的|>是摆脱尾随换行符所必需的。