如何在SQLX的Config块中引用非Includes目录的JavaScript常量
Dataform:在config块引用非includes目录JS文件的问题与解决
问题描述
Google文档中介绍了Dataform在includes目录全局定义字段定义的标准方式:
- 创建
includes/docs.js文件,内容如下:
const myField = 'A definition for myField'; module.exports = { myField };
- 在
definitions/myData/source/mySourceData.sqlx的config块中直接全局引用:
config { type: "view", schema: "mySchema", columns: { myField: docs.myField } ...some SQL
但因Dataform仓库规模大、模块多,希望将文档文件按模块组织到对应目录,比如definitions/myData/shared/myDataDocs.js(内容与docs.js一致)。尝试在mySourceData.sqlx中通过js块引用后,在config块使用时出现myDataDocs is not defined错误:
js { const myDataDocs = require('definitions/myData/shared/myDataDocs.js'); } config { type: "view", schema: "mySchema", columns: { myField: myDataDocs.myField } ...some SQL
解决方案
Dataform中js块内定义的变量默认仅在SQL逻辑块生效,无法直接被config块访问,以下是三种可行的解决方法:
方法1:在includes目录下按模块组织子结构
保持includes的全局加载特性,同时按模块划分目录,比如创建includes/myData/shared/myDataDocs.js,这样文件会被Dataform全局加载,config块中可直接通过对应路径引用:
config { type: "view", schema: "mySchema", columns: { myField: myData.shared.myDataDocs.myField } }
这种方式既满足模块组织需求,又符合Dataform的原生加载规则。
方法2:将变量挂载到全局上下文
在sqlx的js块中,把需要的变量挂载到global对象,让config块能访问到:
js { // 使用相对路径更适配目录结构变动 const myDataDocs = require('./shared/myDataDocs.js'); global.myDataDocs = myDataDocs; } config { type: "view", schema: "mySchema", columns: { myField: myDataDocs.myField } } -- 后续SQL代码
方法3:用JS文件直接导出完整config
如果配置逻辑复杂或需要复用,可把整个config定义放到JS文件中,再在sqlx中引入:
- 创建
definitions/myData/shared/myDataConfig.js:
const myDataDocs = require('./myDataDocs.js'); module.exports = { type: "view", schema: "mySchema", columns: { myField: myDataDocs.myField } };
- 在
mySourceData.sqlx中引用:
config { ...require('./shared/myDataConfig.js') } -- 后续SQL代码
内容的提问来源于stack exchange,提问作者Devin
相关产品推荐
相关产品推荐

