我想提示column的信息,需要获取table的名称,要如何获取
我想提示column的信息,需要获取table的名称,要如何获取啊
Originally posted by @dcycurry in https://github.com/DTStack/monaco-sql-languages/issues/105#issuecomment-1960738532
这个功能我们还在开发中, 相关进展可以关注: https://github.com/DTStack/dt-sql-parser/discussions/250 和 https://github.com/DTStack/dt-sql-parser/pull/253
@dcycurry 可以先手工处理,供参考,大概的思路是:
- 拿到你当前的sql内容,建议把光标位置用一个占位符处理一下,以便sql-parser能解析成功。
- 使用sql-parser解析,定义一个visitor收集解析到的tableName
- 根据tableName去请求columns
import { PostgresSQL, AbstractParseTreeVisitor, type PostgreSQLParserVisitor } from 'dt-sql-parser'
const sql = 'your sql'
class MyVisitor extends AbstractParseTreeVisitor<void> implements PostgreSQLParserVisitor<void> {
public result = { tableName: '' }
visitTable_name(ctx: Table_nameContext) {
if (ctx.text) this.result.tableName = ctx.text.toLowerCase()
}
}
setupLanguageFeatures({
languageId: LanguageIdEnum.PG,
completionService: async(model,
position,
_completionContext,
suggestions) => {
// 先根据参数里的model和position定位你要解析的sql位置,这段我就略过了
const sql = 'your sql'
const parser = new PostgresSQL()
const tree = parser.parse(sql)
const visitor = new MyVisitor()
visitor.visit(tree)
// 这个visitor会返回tableName,你只需要根据当前tableName请求columns就行
const columns = await fetchColumns(visitor.result.tableName)
return { completionItems: columns }
}
})
@Kijin-Seija 非常感谢!现在能提示table name 和columns了
#111
@dcycurry @Kijin-Seija
monaco-sql-languages 0.12.0-beta.11 版本已发布: https://www.npmjs.com/package/monaco-sql-languages/v/0.12.0-beta.11
新增支持了自动补全过程中收集实体,现在你可以在 completionService 的最后一个参数中接收实体信息(表名、字段名等)
另外,此版本上有一些破坏性变更,如果更新后报错,请查看最新的文档。
请在尽快确认该功能是否可用或者是否符合期望,有任何问题,欢迎反馈。
如果没有反馈,本issue将在一周后关闭。
@HaydenOrz 升级后,webpack编译时遇到这个问题,你知道如何解决吗
@HaydenOrz 升级后,webpack编译时遇到这个问题
@dcycurry 看起来像是 webpack 配置中,处理 js 的 loader 版本太旧了, class static block 在 es2022 版本才支持,具体解决方式需要看 webpack 配置中处理js 的loader是什么。 如果用的是 ts-loader 那么需要升级 typescript 和 ts-loader 版本,swc 和 esbuild 同理。
@HaydenOrz 感谢大佬🙏,大部分情况我可以收集到实体了,这里提一种例外的情况
SELECT * FROM database111.<cursor>
光标在<cursor>位置时希望收集到database111这个database,这个情况你们考虑收集吗?
目前似乎可以根据syntax中的wordRanges来判断一下,也能实现
SELECT * FROM database111.<cursor>光标在<cursor>位置时希望收集到database111这个database,这个情况你们考虑收集吗?
暂时不考虑收集,原因同 https://github.com/DTStack/dt-sql-parser/issues/284#issuecomment-2033478419
@dcycurry @Kijin-Seija
monaco-sql-languages 0.12.0-beta.11 版本已发布: https://www.npmjs.com/package/monaco-sql-languages/v/0.12.0-beta.11
新增支持了自动补全过程中收集实体,现在你可以在 completionService 的最后一个参数中接收实体信息(表名、字段名等)
另外,此版本上有一些破坏性变更,如果更新后报错,请查看最新的文档。
感谢,目前升级后使用上没什么问题。就是有些节点好像改用g4 文件里备注的别名了,我得重新梳理一下🤣