在“<unicode string>”的上下文中不允许使用映射值

mapping values are not allowed in this context in "<unicode string>"

在我的循环中,我 运行 一个 dbt 命令并将输出保存到一个 .yml 文件。以下命令有效并在我的 .yml 文件中准确生成一个模式:

for file in models/l30_mart/*.sql; do
    table=$(basename "$file" .sql)
    dbt run-operation generate_model_yaml --args "{\"model_name\": \"$table\"}" > test.yml
done

然而,在上面的示例中,我将 test.yml 文件保存在根目录中。当我尝试将文件保存在另一个路径中时,例如像这样 models/l30_mart/test.yml,它不起作用:

for file in models/l30_mart/*.sql; do
    table=$(basename "$file" .sql)
    dbt run-operation generate_model_yaml --args "{\"model_name\": \"$table\"}" > models/l30_mart/test.yml
done

在这种情况下,当我打开 test.yml 文件时,我看到:

12:06:42  Running with dbt=1.0.1
12:06:43  Encountered an error:
Compilation Error
  The schema file at models/l30_mart/test.yml is invalid because no version is specified. Please consult the documentation for more information on schema.yml syntax:
  
  https://docs.getdbt.com/docs/schemayml-files

我错过了什么?

如果我尝试用提取的 tablename 变量作为文件名来保存不同的文件,它也不起作用:

for file in models/l30_mart/*.sql; do
    table=$(basename "$file" .sql)
    dbt run-operation generate_model_yaml --args "{\"model_name\": \"$table\"}" >  models/l30_mart/$table.yml
done

在这种情况下,文件具有以下输出:

20:39:44  Running with dbt=1.0.1
20:39:45  Encountered an error:
Compilation Error
  The schema file at models/l30_mart/**firsttable.yml** is invalid because no version is specified. Please consult the documentation for more information on schema.yml syntax:
  
  https://docs.getdbt.com/docs/schemayml-files

或这个(例如在 secondtablename.yml 文件中):

20:39:48  Running with dbt=1.0.1
20:39:49  Encountered an error:
Parsing Error
  Error reading dbt_4flow: l30_mart/firstablename.yml - Runtime Error
    Syntax error near line 2
    ------------------------------
    1  | 20:39:44  Running with dbt=1.0.1
    2  | 20:39:45  Encountered an error:
    3  | Compilation Error
    4  |   The schema file at models/l30_mart/firsttablename.yml is invalid because no version is specified. Please consult the documentation for more information on schema.yml syntax:
    5  |   
    
    Raw Error:
    ------------------------------
    mapping values are not allowed in this context
      in "<unicode string>", line 2, column 31

请注意 secondtablename.yml 提到了 firsttablename.yml.

我不知道 dbt 但似乎可能的解释是 dbt 出于某种原因在您调用它时解析该目标目录中的所有 *.yml 文件。由于 shell 在调用 dbt 之前打开了通往 *.yml 文件的管道,因此在调用 dbt 时该文件已经存在(但最初为空)。由于 dbt 期望文件包含 version,您会得到一个错误。

要检查此评估是否正确,请写入临时文件:

for file in models/l30_mart/*.sql; do
    target_file=$(mktemp)
    table=$(basename "$file" .sql)
    dbt run-operation generate_model_yaml --args "{\"model_name\": \"$table\"}" > $target_file
    mv $target_file models/l30_mart/test.yml
done

(如果您使用的是 macOS,请注意 mktemp shenanigans

编辑:由于 dbt 似乎受到现有文件的影响,您还可以尝试生成 所有 文件,然后将它们移动到正确的目录中:

target_dir=$(mktemp -d)
for file in models/l30_mart/*.sql; do
    table=$(basename "$file" .sql)
    dbt run-operation generate_model_yaml --args "{\"model_name\": \"$table\"}" > $target_dir/$table.yml
done
mv $target_dir/*.yml models/l30_mart/
rmdir $target_dir