You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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中引入:

  1. 创建definitions/myData/shared/myDataConfig.js:
const myDataDocs = require('./myDataDocs.js');

module.exports = {
  type: "view",
  schema: "mySchema",
  columns: {
    myField: myDataDocs.myField
  }
};
  1. 在mySourceData.sqlx中引用:
config {
  ...require('./shared/myDataConfig.js')
}

-- 后续SQL代码

内容的提问来源于stack exchange,提问作者Devin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:06:02