TypeORM 连接 Microsoft SQL Server 完全指南:mssql 驱动选项、连接池调优与 Vector 向量类型实战 TypeORM 连接 Microsoft SQL Server 完全指南mssql 驱动选项、连接池调优与 Vector 向量类型实战【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址: https://gitcode.com/GitHub_Trending/ty/typeorm本篇指南基于 TypeORM 官方文档中 SQL Server 驱动章节系统讲解如何在 Node.js 应用中通过mssql驱动连接 Microsoft SQL Server从数据源选项连接参数、认证方式、连接池、options底层配置到各参数在源码中的实际处理逻辑再到 SQL Server 支持的列类型清单、新的vector向量类型及其相似度搜索实践以及连接池隔离级别不重置这一已知问题的规避方案。读完后你可以完成一套可复制的 SQL Server 数据源配置并理解每个关键参数在 SqlServerDriver 中的落点。一、安装驱动与底层依赖加载SQL Server 驱动基于 tedious 的 MSSQL 实现TypeORM 通过mssql包与之通信。安装方式npm install mssql驱动包并非 TypeORM 的默认依赖需要在 SqlServerDriver.loadDependencies 中显式加载它优先使用数据源中显式传入的driver对象this.options.driver ?? PlatformTools.load(mssql)加载失败则抛出DriverPackageNotInstalledError(SQL Server, mssql)。这解释了 SqlServerDataSourceOptions 中为何存在一个driver?: any字段——当mssql无法通过require解析例如打包环境时你可以把驱动实例直接注入该字段。二、数据源选项总览通用数据源选项logging、synchronize、entities等请参考 Data Source Options。SQL Server 专属选项定义在 SqlServerConnectionCredentialsOptions 与 SqlServerDataSourceOptions 中type固定为mssqlimport { DataSource } from typeorm const dataSource new DataSource({ type: mssql, host: localhost, port: 1433, username: sa, password: Admin12345, database: tempdb, logging: false, })仓库自带的 ormconfig.sample.json 中就包含了一份mssql测试配置localhost:1433sa/Admin12345库名tempdb可作为最小可运行样例参考。2.1 连接基础参数选项说明url连接 URL。注意其他数据源选项会覆盖从 URL 解析出的参数host数据库主机port数据库主机端口MSSQL 默认1433username数据库用户名password数据库密码database数据库名schemaSchema 名默认dbodomain设置后驱动将以 domain 登录方式连接 SQL Server从源码结构看connect()阶段若未显式提供database/schemaSqlServerDriver.connect 会通过 QueryRunner 执行getCurrentDatabase()/getCurrentSchema()探测当前库与searchSchema再回落到this.schema ?? this.searchSchema——这就是默认 schema 表现为dbo的机制。2.2 认证方式authentication除了username/passwordSqlServerConnectionCredentialsOptions 还支持authentication字段它是一个联合类型传入后会覆盖username与password。仓库中 src/driver/sqlserver/authentication 目录定义了八种认证形态DefaultAuthentication普通 SQL 认证对应username/passwordNtlmAuthenticationWindows 域登录type: ntlm需提供 Windows 账户的userName、password以及必填的domain见 NtlmAuthentication.ts六种 Azure Active Directory 认证azure-active-directory-password、azure-active-directory-default、azure-active-directory-access-token、azure-active-directory-msi-app-service、azure-active-directory-msi-vm、azure-active-directory-service-principal-secret。例如 Azure AD 密码认证的配置字段定义见 AzureActiveDirectoryPasswordAuthentication.tsauthentication: { type: azure-active-directory-password, options: { userName: myUser, password: myPassword, domain: myTenant, // 可选指定 Azure 租户 ID }, },这些认证对象最终原样传给mssql驱动SqlServerDriver.createPool 中connectionOptions的authentication: credentials.authentication字段直接把认证配置透传给new this.mssql.ConnectionPool(connectionOptions)。三、超时、流式读取与连接池选项3.1 顶层选项选项说明默认值connectionTimeout连接超时毫秒15000requestTimeout请求超时毫秒。注意msnodesqlv8驱动不支持小于 1 秒的超时15000stream以流式方式逐行返回结果集而非一次性全部返回。也可以对单个请求单独启用request.stream true。如果你要处理大量行请始终设为truefalsereplication读写分离master写库slaves[]只读库列表defaultMode默认slave-createPool会把这三个顶层值直接并入驱动连接参数connectionTimeout、requestTimeout、stream并强制默认useUTC: false若未显式设置同时追加enableArithAbort: true以匹配即将发布的 tedious 配置约定见 createPool 实现。3.2 pool 连接池选项pool字段完整定义见 SqlServerDataSourceOptions.ts选项说明默认值pool.max连接池最大连接数10pool.min连接池最小连接数0pool.maxWaitingClients允许排队的请求数超出后acquire调用将在后续事件循环中以错误回调-pool.acquireTimeoutMillisacquire调用等待资源的最长毫秒数默认无限制若提供须为非零正整数无限制pool.fifotrue表示最老的连接最先分配false则把池从队列变成栈最近释放的先分配truepool.priorityRange整数设置为 1~x 后无可用资源时借用者可以指定其在队列中的相对优先级1pool.evictionRunIntervalMillis驱逐检查的执行频率毫秒0不执行pool.numTestsPerRun每次驱逐检查检查的资源数量3pool.softIdleTimeoutMillis对象在池中空闲多久后有资格被空闲驱逐器驱逐前提是池中至少保留 “min idle” 个实例-1不可被驱逐pool.idleTimeoutMillis对象空闲多久后有资格因空闲被驱逐优先级高于softIdleTimeoutMillis30000pool.errorHandler底层池发出error事件时的处理函数接收单个 error 参数默认以warn级别记录日志记录日志关于errorHandler值得一提源码中的一个细节createPool 中若你没有提供pool.errorHandlerTypeORM 会自动挂一个默认处理器通过数据源的 logger 以warn级别输出MSSQL pool raised an error.。注释明确说明这是必需的否则池错误会成为未处理异常并导致宿主应用崩溃——生产环境建议始终传入自己的errorHandler。四、options底层驱动行为配置options字段定义见 SqlServerDataSourceOptions.ts对应mssql/tedious的底层行为开关选项说明默认值options.fallbackToDefaultDb若options.database请求的库不可访问默认连接会失败设为true则改用用户的默认数据库falseoptions.instanceName要连接的实例名。要求数据库服务器上运行 SQL Server Browser 服务且 UDP 1434 端口可达。与port互斥无options.enableAnsiNullDefaulttrue时初始 SQL 中执行SET ANSI_NULL_DFLT_ON ON新建列默认可空trueoptions.cancelTimeout请求取消中止被视为失败前的毫秒数5000options.packetSizeTDS 包大小与服务端协商应为 2 的幂4096options.useUTC时间值按 UTC 还是本地时间传递falseoptions.abortTransactionOnError事务执行中遇到任何错误时是否自动回滚初始 SQL 阶段设置SET XACT_ABORT-options.localAddress连接时使用的本机网络接口IP 地址-options.useColumnNames行以键值集合而非数组形式返回falseoptions.camelCaseColumns返回列名首字母是否转小写提供了columnNameReplacer时此值被忽略falseoptions.isolationLevel事务默认隔离级别READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE/SNAPSHOT。⚠️ 存在连接池复用的限制见已知问题READ COMMITTEDoptions.connectionIsolationLevel新连接的默认隔离级别所有事务外查询按此执行。⚠️ 同样受上述限制READ COMMITTEDoptions.readOnlyIntent是否向 SQL Server 可用性组请求只读访问falseoptions.encrypt是否加密连接在 Windows Azure 上应设为truetrueoptions.cryptoCredentialsDetails使用加密时传给tls.createSecurePair首参的对象{}options.rowCollectionOnDonetrue时在 Request 的done*事件中暴露接收到的行。注意大量行时可能过度占用内存falseoptions.rowCollectionOnRequestCompletiontrue时在 Request 完成回调中暴露接收到的行。同样有内存风险falseoptions.tdsVersionTDS 版本7_1/7_2/7_3_A/7_3_B/7_4服务端不支持指定版本时会协商降级7_4options.appName用于在 SQL Server 的性能剖析、日志或跟踪工具中标识应用node-mssqloptions.trustServerCertificate无可信服务器证书时是否仍加密falseoptions.multiSubnetFailover是否并行连接 DNS 返回的所有 IPAlwaysOn 多子网场景falseoptions.debug.packet/data/payload/token四个调试开关分别控制是否发出描述包详情、包数据、包负载、token 流的debug事件均falseTypeORM 侧对隔离级别做了一层转换convertIsolationLevel 把字符串如READ COMMITTED映射为mssql.ISOLATION_LEVEL枚举值底层驱动要求的是枚举而非字符串非法级别会由 validate-isolation-level 校验后抛出TypeORMError。五、支持的列类型与默认值SQL Server 驱动支持的全部列类型与 SqlServerDriver.supportedDataTypes 一致int, bigint, bit, decimal, money, numeric, smallint, smallmoney, tinyint, float, real, date, datetime2, datetime, datetimeoffset, smalldatetime, time, char, varchar, text, nchar, nvarchar, ntext, binary, image, varbinary, hierarchyid, sql_variant, timestamp, uniqueidentifier, xml, geometry, geography, rowversion, vector几组容易踩坑的类型细节均可在 SqlServerDriver 中验证JS 类型映射normalizeTypeNumber→intString→nvarcharDate→datetimeBoolean→bituuid→uniqueidentifiersimple-array/simple-json→ntext。类型默认长度/精度dataTypeDefaultsvarchar/nvarchar默认长度255char/nchar默认1decimal/numeric默认(18, 0)time/datetime2/datetimeoffset默认精度7vector默认长度255。未显式指定长度时nvarchar列会落成nvarchar(255)。ORM 内部列映射mappedDataTypesCreateDateColumn等时间列使用datetime2并默认getdate()乐观锁VersionColumn使用int缓存列使用nvarchar(MAX)。可空性deleteDateNullable: true即软删除列可空。参数化SQL Server 参数需携带类型信息parametrizeValue会把值包装为 MssqlParameter参数前缀为parametersPrefix 。六、Vector 向量类型与相似度搜索SQL Server 新增的vector数据类型用于存储高维向量常见场景嵌入语义检索、推荐系统、相似度匹配、机器学习应用。注意通用的halfvec类型支持不可用因为该特性仍处于预览阶段见 Microsoft 的 Vector data type 文档。6.1 定义向量列Entity() export class DocumentChunk { PrimaryGeneratedColumn() id: number Column(varchar) content: string // 1998 维向量列 Column(vector, { length: 1998 }) embedding: number[] }要求需要支持 vector 的 SQL Server 版本向量维度必须通过length选项指定。从源码看维度会直接进入建表 DDLcreateFullType 中vector类型被渲染为vector(${column.length})读写时 preparePersistentValue 会把number[]序列化为 JSON 字符串写入prepareHydratedValue在读取时用JSON.parse还原为数组解析失败则原样返回。6.2 使用 VECTOR_DISTANCE 做相似度搜索SQL Server 提供VECTOR_DISTANCE函数计算向量间距离const queryEmbedding [/* 你的查询向量 */] const results await dataSource.query( DECLARE question AS VECTOR (1998) 0; SELECT TOP (10) dc.*, VECTOR_DISTANCE(cosine, question, embedding) AS distance FROM document_chunk dc ORDER BY VECTOR_DISTANCE(cosine, question, embedding) , [JSON.stringify(queryEmbedding)], )距离度量cosine— 余弦距离语义检索中最常用euclidean— 欧氏L2距离dot— 负点积。仓库中的功能测试 test/functional/database-schema/vectors/sqlserver/vector.test.ts 覆盖了完整闭环建表后校验embedding列类型为vector且长度为1998、保存/读取 1998 维随机向量的精度比较closeTo 0.0001、更新向量值以及用VECTOR_DISTANCE执行余弦相似度检索并按距离排序——与本文示例完全对应可作为验证基准。七、已知问题连接池不重置隔离级别驱动专属的options.isolationLevel与options.connectionIsolationLevel在底层 node-mssql 驱动创建连接时会被正确应用。但node-mssql在把连接归还到池时不会调用connection.reset()——这意味着任何操作例如一个不同隔离级别的显式事务一旦修改了池中某个连接的隔离级别该修改会持续存在并泄漏给该连接的下一个使用者。实际后果对于同时使用“逐事务隔离级别”的应用这两个选项变得不可靠。推荐替代方案改用所有驱动通用的顶层isolationLevel数据源选项。它在每次事务开始时显式应用隔离级别完全绕开池的限制详见 Transactions 文档 Default Isolation Level。这也是 SqlServerDataSourceOptions 中两个隔离级别字段注释所明确警示的行为“this setting may not be reliably preserved across pooled connection reuse”。该上游限制已被跟踪在 tediousjs/node-mssql#1483 中。八、小结连接 SQL Server 需先npm install mssqltype设为mssql基础参数与 ormconfig.sample.json 中的示例对齐即可起步认证支持 SQL、NTLMWindows 域需domain与六种 Azure AD 方式authentication优先于username/passwordpool与options两层配置分别控制池行为与 TDS 层行为池错误务必挂接errorHandler否则可能导致应用崩溃类型系统以nvarchar/datetime/bit为 JS 类型默认映射varchar/nvarchar缺省长度为255向量列必须显式给出length隔离级别不要依赖options.isolationLevel连接池不重置统一使用顶层isolationLevel选项。主要参考路径SqlServerDataSourceOptions.ts、SqlServerConnectionCredentialsOptions.ts、SqlServerDriver.ts、authentications、sqlserver vector 测试。【免费下载链接】typeormTypeScript JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more.项目地址: https://gitcode.com/GitHub_Trending/ty/typeorm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考