引言:为什么 TypeScript 和 PostgreSQL 是您项目的理想组合
\n\n您是否想过,为什么开发者越来越倾向于选择 TypeScript 和 PostgreSQL 的组合?这不仅仅是一种时尚潮流——这是一个强大的组合,正在改变现代 Web 开发的游戏规则。想象一下,一把瑞士军刀和一个可靠的保险箱合二为一:TypeScript 为代码带来了严谨性和可预测性,而 PostgreSQL 则提供了数据存储的可靠性和灵活性。
\n\n在本指南中,我们不会仅仅停留在理论上。我们将深入实际实践:配置连接、编写查询、创建 API,并学习如何避免常见错误。准备好了吗?让我们开始吧!
\n\n环境配置:如何开始使用 TypeScript 和 PostgreSQL
\n\n在编写代码之前,让我们先打好基础。安装依赖项就像建造房屋的地基:地基越牢固,项目就能维持得越久。
\n\n安装必要的包
\n\n我们需要两个主要工具:pg(PostgreSQL 客户端)和带有类型的 typescript。在终端中执行以下命令:
npm init -y\nnpm install pg\nnpm install -D typescript @types/node @types/pg\nnpx tsc --init\n\n\n请注意:我们单独安装了 pg 的类型。这是使用 TypeScript 数据库 的必要条件——否则编译器会因缺少类型而报错。
项目基本结构
\n\n创建一个文件 database.ts——这将是我们连接的核心。以下是一个最小但可用的模板:
import { Pool } from 'pg';\n\nconst pool = new Pool({\n user: 'your_username',\n host: 'localhost',\n database: 'your_database',\n password: 'your_password',\n port: 5432,\n});\n\nexport default pool;\n\n\n为什么使用 Pool 而不是普通客户端?Pool 管理连接池,这对生产环境至关重要。想象一下,每个请求就像咖啡馆里的顾客。没有连接池,您需要为每个顾客开一家新咖啡馆。有了连接池,您已经有几张桌子,只需安排客人入座即可。
基本操作:在 TypeScript 中使用 PostgreSQL 进行 CRUD
\n\n现在是最有趣的部分——编写查询。我们将创建一个简单的用户表,并实现所有四种操作:创建、读取、更新、删除。
\n\n创建表
\n\n在处理数据之前,需要创建结构。以下是通过 TypeScript 实现的方法:
\n\nimport pool from './database';\n\nasync function createTable() {\n const query = `\n CREATE TABLE IF NOT EXISTS users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n email VARCHAR(255) UNIQUE NOT NULL,\n age INTEGER CHECK (age > 0),\n created_at TIMESTAMP DEFAULT NOW()\n );\n `;\n \n try {\n await pool.query(query);\n console.log('用户表已创建');\n } catch (error) {\n console.error('错误:', error);\n }\n}\n\ncreateTable();\n\n\n请注意 SERIAL——这是 PostgreSQL 自动生成的自增字段。而 CHECK 确保年龄为正数。这是 PostgreSQL TypeScript 如何在两个层面上共同保证数据完整性的示例。
添加数据(创建)
\n\n带参数的插入是避免 SQL 注入的安全方式:
\n\ninterface User {\n name: string;\n email: string;\n age: number;\n}\n\nasync function addUser(user: User) {\n const query = `\n INSERT INTO users (name, email, age)\n VALUES ($1, $2, $3)\n RETURNING *;\n `;\n \n const values = [user.name, user.email, user.age];\n \n try {\n const result = await pool.query(query, values);\n console.log('已添加用户:', result.rows[0]);\n return result.rows[0];\n } catch (error) {\n console.error('添加时出错:', error);\n throw error