Ошибка - ожидается, но нашел '<scalar>' - PullRequest
0 голосов
/ 23 ноября 2018

Я борюсь с запросом SQL в файле YAML.Я проверил мой 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 lint, но не могу найти способ, чтобы мой файл YAML принял мой запрос.

Ошибка, возникающая при запускеМой сценарий:

Syntax Error while loading YAML.\n  expected <block end>, but found '<scalar>'

Веб-сайт YAML lint выдаст эту ошибку:

did not find expected key while parsing a block mapping at line 1 column 1 

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Лучший способ поместить скаляры с одинарными и двойными кавычками в 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 стиля блока, но, конечно, для оболочки, которая выполняет строку, загруженную из скаляра).).

- после | соотв.> необходимо, чтобы избавиться от завершающего символа новой строки.

0 голосов
/ 23 ноября 2018

Ваш запрос недействителен 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/

...