如何在YDB Node.js SDK中获取IType类型的字符串表示?
解决方法:获取Ydb.IType的YQL类型字符串表示
方法一:使用SDK内置的类型格式化工具
ydb-nodejs-sdk内部提供了专门的工具函数,可直接将Ydb.IType转换为符合YQL语法的类型字符串,无需手动映射:
import { formatType } from '@ydb-sdk/table'; function doSomethingToGetFieldType(field: Ydb.IType): string { return formatType(field); }
这个函数会自动处理所有基础类型(如UTF8对应STRING、UINT64对应UINT64)和复杂类型(如结构体、数组),直接返回可用于YQL查询的类型声明字符串。
方法二:手动实现类型映射(自定义场景)
如果需要更灵活的控制逻辑,可以基于Ydb.Type.TypeId枚举手动实现类型映射:
function doSomethingToGetFieldType(field: Ydb.IType): string { const typeId = Ydb.Type.TypeId[field.typeId]; // 基础类型映射表 const basicTypeMap: Record<string, string> = { UTF8: 'STRING', UINT64: 'UINT64', INT64: 'INT64', DOUBLE: 'DOUBLE', BOOL: 'BOOL', DATE: 'DATE', DATETIME: 'DATETIME', TIMESTAMP: 'TIMESTAMP', JSON: 'JSON' }; // 返回基础类型对应的YQL字符串 if (basicTypeMap[typeId]) { return basicTypeMap[typeId]; } // 处理数组类型 if (typeId === 'LIST') { const itemTypeStr = doSomethingToGetFieldType(field.listType!.itemType!); return `LIST<${itemTypeStr}>`; } // 处理结构体类型 if (typeId === 'STRUCT') { const structFields = field.structType!.members!.map(member => `${member.name}: ${doSomethingToGetFieldType(member.type!)}` ).join(', '); return `STRUCT(${structFields})`; } // 未知类型默认返回枚举名称 return typeId; }
效果验证
使用上述任意方法后,你的insertTest函数生成的查询会自动生成正确的类型声明,示例最终生成的YQL语句如下:
DECLARE $id AS STRING; DECLARE $value AS STRING; INSERT INTO `tests` (`id`, `value`) VALUES ($id, $value);
内容的提问来源于stack exchange,提问作者Denis Karimov
相关产品推荐
相关产品推荐

