在“<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
在我的循环中,我 运行 一个 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