ts-sql-query 用于 TypeScript:完整指南与示例
\n\n1. 这是什么以及为什么需要它
\n\n ts-sql-query 是一个强大的 TypeScript 库,它允许你编写具有完全类型支持的 SQL 查询(类型安全)。它提供了一个便捷的 DSL(领域特定语言)来构建 SQL 查询,同时每个查询都会由 TypeScript 编译器根据数据库模式进行检查。这意味着表名、字段名或数据类型中的错误将在编译阶段被捕获,而不是在运行时。\n
\n\n 为什么需要它?在传统方法(原始 SQL 字符串或 ORM)中,开发者经常遇到问题:列名拼写错误、类型不匹配、重构困难。ts-sql-query 通过为所有操作提供严格的类型化来解决这些问题:SELECT、INSERT、UPDATE、DELETE、JOIN、子查询、聚合函数等等。该库支持多种数据库管理系统(PostgreSQL、MySQL、SQLite、MariaDB、MSSQL),并且可以直接与驱动程序或通过连接池一起使用。\n
\n\n 与 ORM(例如 TypeORM 或 Prisma)不同,ts-sql-query 不会将 SQL 隐藏在抽象层之后,而是使其成为 TypeScript 代码的一部分。你仍然编写 SQL,但带有自动补全、类型检查且没有 SQL 注入风险。对于重视性能和对查询完全控制,同时又希望利用静态类型优势的项目来说,这是理想的选择。\n
\n2. 安装
\n通过 npm 进行安装。你需要安装库本身以及你的数据库驱动程序。
\n# 安装主库\nnpm install ts-sql-query\n\n# 安装 PostgreSQL 驱动程序(示例)\nnpm install pg\n\n# 安装 MySQL 驱动程序\nnpm install mysql2\n\n# 安装 SQLite 驱动程序\nnpm install better-sqlite3\n\n# 安装 SQLite 驱动程序(异步)\nnpm install sql.js\n\n# 安装 Node.js 类型(如果使用)\nnpm install --save-dev @types/node\n 安装驱动程序后,你需要创建一个数据库连接。ts-sql-query 为每个驱动程序提供了适配器。
\n3. 快速入门 — 最小工作示例
\n我们来看一个 PostgreSQL 的示例。创建一个简单的 users 表并执行一个 SELECT 查询。
import { createPool } from 'pg';\nimport { PostgreSqlConnection } from 'ts-sql-query/connections/PostgreSqlConnection';\n\n// 1. 创建连接池\nconst pool = createPool({\n host: 'localhost',\n port: 5432,\n database: 'testdb',\n user: 'user',\n password: 'password',\n});\n\n// 2. 创建连接类\nclass DBConnection extends PostgreSqlConnection {\n // 可以在这里定义用于操作表的方法\n}\n\n// 3. 创建连接实例\nconst connection = new DBConnection(pool);\n\n// 4. 为 users 表定义类型\ninterface User {\n id: number;\n name: string;\n email: string;\n age: number;\n}\n\n// 5. 创建用于操作表的对象\nconst users = connection.table('users').columns({\n id: 'id',\n name: 'name',\n email: 'email',\n age: 'age',\n});\n\n// 6. 执行查询\nasync function getUsers() {\n const query = connection\n .selectFrom(users)\n .select(users.id, users.name, users.email)\n .where(users.age.greaterThan(18))\n .orderBy(users.name, 'asc');\n\n const result = await query.executeSelectMany();\n return result;\n}\n\ngetUsers().then(users => {\n console.log('Users:', users);\n}).catch(err => {\n console.error('Error:', err);\n});\n 在这个示例中,我们创建了