拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SQL Server 与 Node.js on Windows 入门:从 Tedious CRUD、Sequelize ORM 到 Columnstore 性能优化实战

示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载导读本文以 Microsoft SQL Server 官方示例仓库中的 Node.js on Windows 入门指南 为骨架完整还原在 Windows 环境下使用 Node.js 连接并操作 SQL Server 2016及以上版本的三种典型工作负载基于 tedious 驱动的手写 SQL CRUD、基于 Sequelize ORM 的模型化 CRUD以及利用列存储索引Columnstore加速聚合查询的性能优化。文中所有命令与代码均取自仓库内的真实示例文件读者按步骤执行即可在本机复现一套完整的 Node.js SQL Server 开发流程并理解每一段示例背后的连接原理与执行细节。示例概览本指南覆盖哪些能力关联文档明确标注了本教程的三个核心工作负载它们分别对应仓库 samples/tutorials/node.js/Windows 目录下的三个子项目工作负载子项目目录核心文件技术要点CRUD with Node.jsSqlServerSampleconnect.js、crud.js、CreateTestData.sqltedious 驱动 参数化 SQLCRUD with Sequelize ORMSqlServerSequelizeSampleorm.jsSequelize 模型、关联与同步Performance with ColumnstoreSqlServerColumnstoreSamplecolumnstore.js、CreateSampleTable.sql500 万行聚合查询 列存储索引适用版本SQL Server 2016或更高版本编程语言JavaScriptNode.js环境准备五项前置条件在开始运行示例之前需要先准备好以下软件环境对应文档 Before you begin 一节SQL Server 2016 或更高版本本机可用的 SQL Server 实例示例默认连接localhost使用sa账号登录。Node.js运行 JavaScript 代码的运行时环境。Sequelize ORM用于 SqlServerSequelizeSample 示例的 ORM 库需通过 npm 安装见下文依赖说明。文本编辑器用于修改示例源码中的连接字符串用户名与密码。sql-climssql 命令行工具用于执行建库、建表等 SQL 脚本。示例中通过mssql命令与 SQL Server 交互。说明示例源码中的sa密码默认占位为your_password运行时必须替换为你自己实例的真实密码。第一步创建 SampleDB 数据库所有示例共用同一个数据库SampleDB。打开命令提示符执行以下命令创建数据库将your_password替换为实际密码mssql -s localhost -u sa -p your_password -q CREATE DATABASE SampleDB;参数含义-s localhost指定服务器地址-u sa指定登录用户-p your_password指定密码-q ...直接执行传入的 SQL 语句。第二步CRUD via Node.jsSqlServerSample2.1 修改连接字符串用文本编辑器打开 SqlServerSample/connect.js将其中的userName与password改为你自己的凭据var config { userName: sa, // update me password: your_password, // update me server: localhost, options: { database: SampleDB } } var connection new Connection(config);这段代码使用tedious驱动创建连接对象。从源码可以看到连接建立后通过connection.on(connect, ...)事件回调判断是否成功出错时打印错误对象成功时在控制台输出Connectedconnection.on(connect, function(err) { if (err) { console.log(err); } else { console.log(Connected); } });2.2 验证连接在终端运行node connect.js若连接成功控制台将打印Connected。2.3 准备测试数据回到 sql-cli连接 SampleDB 并执行 CreateTestData.sql 脚本创建 CRUD 示例所需的表与初始数据mssql -s localhost -u sa -p your_password -d SampleDB -T 60000 .run ./CreateTestData.sql其中-d SampleDB指定目标数据库-T 60000将命令超时设置为 60000 毫秒.run用于执行脚本文件。该脚本实际执行了以下 SQLCREATE SCHEMA TestSchema; GO CREATE TABLE TestSchema.Employees ( Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Name NVARCHAR(50), Location NVARCHAR(50) ); GO INSERT INTO TestSchema.Employees (Name, Location) VALUES (NJared, NAustralia), (NNikita, NIndia), (NTom, NGermany); GO它创建了TestSchema架构与Employees表自增主键Id、Name、Location三列并预置三条员工记录。2.4 运行 CRUD 示例node crud.jscrud.js 使用async.waterfall串行编排了完整的增删改查流水线每一步都通过Request对象执行参数化 SQLInsert增INSERT INTO TestSchema.Employees (Name, Location) OUTPUT INSERTED.Id VALUES (Name, Location);通过request.addParameter(Name, TYPES.NVarChar, name)绑定参数执行后打印1 row(s) inserted。SQL 中的OUTPUT INSERTED.Id用于回读新插入行的自增 Id。Update改UPDATE TestSchema.Employees SET LocationLocation WHERE Name Name;。Delete删DELETE FROM TestSchema.Employees WHERE Name Name;。Read查SELECT Id, Name, Location FROM TestSchema.Employees;通过request.on(row, ...)事件逐行打印查询结果。全部完成后打印Done!。值得强调的是示例全程使用Name、Location参数占位符而非字符串拼接这是防止 SQL 注入的正确实践。依赖方面SqlServerSample/package.json 声明了tediousSQL Server 官方推荐的 Node.js TDS 驱动与async流程控制库两个运行时依赖dependencies: { async: ^2.1.2, tedious: ^1.14.0 }在项目目录执行npm install即可安装。第三步CRUD via SequelizeSqlServerSequelizeSample3.1 修改连接参数并运行打开 SqlServerSequelizeSample/orm.js更新密码后直接运行node orm.js该示例不依赖 sql-cliSequelize 会通过sampleDb.sync({force: true})自动完成建表。ORM 初始化代码如下var sampleDb new Sequelize(sampleDbName, userName, password, { dialect: mssql, host: hostName, port: 1433, // Default port logging: false, // disable logging; default: console.log dialectOptions: { requestTimeout: 30000 // timeout 30 seconds } });这里有几个关键配置值得注意dialect: mssql指定 SQL Server 方言port: 1433SQL Server 默认端口logging: false关闭默认的 SQL 日志输出requestTimeout: 30000请求超时设为 30 秒。3.2 模型定义与关联示例用 Sequelize 定义了三个模型并建立一对多关系var User sampleDb.define(user, { firstName: Sequelize.STRING, lastName: Sequelize.STRING }); var Task sampleDb.define(task, { title: Sequelize.STRING, dueDate: Sequelize.DATE, isComplete: Sequelize.BOOLEAN }); // Model a 1:Many relationship between User and Task User.hasMany(Task);3.3 基于模型的完整 CRUD 演示sampleDb.sync({force: true})会先 DROP 再 CREATE 表结构随后依次演示CreateUser.create({firstName: Anna, lastName: Shrestinian})与Task.create({title: Ship Helsinki, dueDate: new Date(2017,04,01), isComplete: false})关联user.setTasks([task])将任务分配给用户Read带关联过滤User.findAll({ where: { firstName: Anna}, include: [{ model: Task, where: { isComplete: false } }] })查询 Anna 名下未完成的任务Updatetask.update({ dueDate: new Date(2016,06,30) })修改任务截止日期DeleteTask.destroy({ where: { dueDate: {$lte: new Date(2016,12,31)}} })删除 2016 年及以前到期的所有任务。这个示例展示了如何用 ORM 将表结构、关系、查询逻辑全部收敛到 JavaScript 模型层适合需要快速建模与迭代的项目场景。注意由于仓库中的 orm.js 使用了$lte这类旧版 Sequelize 操作符语法若使用新版 Sequelize 运行可能需要按版本调整操作符写法如Op.lte或开启operatorsAliases兼容配置。第四步Performance with ColumnstoreSqlServerColumnstoreSample4.1 生成 500 万行测试数据先用 sql-cli 执行建表脚本 CreateSampleTable.sqlmssql -s localhost -u sa -p your_password -d SampleDB -T 60000 .run ./CreateSampleTable.sql该脚本利用递归式的VALUES交叉连接一次性生成 500 万行订单数据并写入Table_with_5M_rows表WITH a AS (SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS a(a)) SELECT TOP(5000000) ROW_NUMBER() OVER (ORDER BY a.a) AS OrderItemId ,a.a b.a c.a d.a e.a f.a g.a h.a AS OrderId ,a.a * 10 AS Price ,CONCAT(a.a, N , b.a, N , c.a, N , d.a, N , e.a, N , f.a, N , g.a, N , h.a) AS ProductName INTO Table_with_5M_rows FROM a, a AS b, a AS c, a AS d, a AS e, a AS f, a AS g, a AS h;注意INTO会同时创建新表并将数据一次性载入。表包含OrderItemId、OrderId、Price、ProductName四列。4.2 运行聚合性能测试node columnstore.jscolumnstore.js 的核心是exec函数对 500 万行数据执行SELECT SUM(Price) FROM Table_with_5M_rows聚合查询并用console.time/console.timeEnd测量查询耗时function exec(sql) { var timerName QueryTime; var request new Request(sql, function(err) { if (err) { console.log(err); } }); request.on(doneProc, function(rowCount, more, rows) { if(!more){ console.timeEnd(timerName); } }); request.on(row, function(columns) { columns.forEach(function(column) { console.log(Sum: column.value); }); }); console.time(timerName); connection.execSql(request); }doneProc事件在存储过程/批量语句执行完成时触发more为false表示全部结果返回完毕此时打印耗时。从源码中的注释可以看到 Azure 场景的注意事项——连接 Azure SQL Database 时需开启加密与指定数据库// When you connect to Azure SQL Database, you need these next options. //options: {encrypt: true, database: yourDatabase}另外该示例依赖node-uuid与async两个 npm 包运行前需在对应目录执行npm install。4.3 为什么列存储索引能加速示例主题是列存储Columnstore性能优化。列存储索引按列而非按行存储数据并配合列式压缩与批量模式Batch Mode执行对SUM、AVG、COUNT这类大数据量聚合查询有数量级的吞吐提升这正是该示例选择500 万行 SUM 聚合作为测试载荷的原因。读者可先在行存储表上运行columnstore.js记录基线耗时再为该表创建聚集列存储索引CREATE CLUSTERED COLUMNSTORE INDEX ... ON Table_with_5M_rows;后重跑对比即可直观感受列存储带来的性能差异。常见问题与注意事项凭据必须修改三个示例的连接字符串均硬编码了sa / your_password直接运行会连接失败Azure SQL Database 场景还需补上encrypt: true选项。sql-cli 的-T参数-T 60000用于放大命令超时上限防止大数据量脚本如 500 万行生成脚本执行超时。Sequelize 版本差异orm.js 中的$lte、findById等写法属于旧版 API高版本 Sequelize 下需做相应迁移。npm 依赖安装SqlServerSample 需要tedious与asyncSqlServerColumnstoreSample 需要node-uuid与async运行前请在各自目录执行npm install。免责声明仓库内的脚本与本指南均作为示例提供不属于任何 Azure 服务不受任何 SLA 或其他 Azure 相关协议保障按原样提供且不附带任何明示或暗示的担保。微软不对脚本的使用或本文档的准确性承担任何责任。使用前请先熟悉脚本内容对应文档 Disclaimers 一节。进一步学习本仓库还提供了 Windows、Ubuntu、RHEL 与 macOS 四个平台的 Node.js 入门教程各平台示例结构一致、命令略有差异想继续深入 SQL Server 功能可参考仓库 samples/features 下的专栏存储、内存优化、JSON 等专项示例官方入门教程总览可参见 samples/tutorials/README.md。赞分享示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载相关推荐SQL Server 与 Java on Windows 快速上手JDBC CRUD、Hibernate ORM 与 Columnstore 性能实战sql-server-samplesSQL Server 与 Java on Windows 快速上手JDBC CRUD、Hibernate ORM 与 Columnstore 性能实战sql示例工程数据库教程后端抖音批量下载神器douyin-downloader 完全指南5分钟搞定无水印批量下载抖音批量下载神器douyin downloader 完全指南5分钟搞定无水印批量下载 还在为抖音视频下载而烦恼吗想要保存喜欢的视频却发现水印难以去除需要示例工程数据库教程后端在 macOS 上使用 Node.js 快速上手 SQL ServerCRUD、Sequelize ORM 与 Columnstore 性能优化实战在 macOS 上使用 Node.js 快速上手 SQL ServerCRUD、Sequelize ORM 与 Columnstore 性能优化实战 本文基于示例工程数据库教程后端上一篇APIJSON 项目推荐下一篇pycdc为什么这个Python字节码逆向工程工具能跨越25年版本鸿沟创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门