🏠

Node.js操作数据库

让程序和数据库对话

讲师:乌鸦哥

+ =

Node.js为什么要操作数据库?

想象一下没有数据库的网站... 😱

  • 用户注册后,关机就忘记了
  • 购物车商品,刷新就没了
  • 文章发布了,重启就消失
  • 这样的网站还有什么用?

数据库是程序的"记忆"

Node.js + 数据库 = 有记忆的智能程序

  • 持久化存储 - 数据永远不丢失
  • 实时交互 - 随时读取和更新
  • 多用户共享 - 大家看到同样的数据
  • 数据分析 - 了解用户行为

最简单的数据库包 - sqlite3

新手程序员的好朋友 🤝

为什么选择 sqlite3?

就像学自行车,先从最简单的开始

  • 轻量级 - 只是一个文件
  • 免安装 - 不需要启动服务器
  • 快速上手 - 几分钟就能用
  • 本地开发 - 完美的学习工具

安装 sqlite3


# 就像去商店买工具一样简单
npm install sqlite3
            

一行命令,搞定!🎉

如何使用 sqlite3 包?

三步曲:连接 → 操作 → 关闭

第一步:引入和连接


// 引入 sqlite3 包
const sqlite3 = require('sqlite3').verbose();

// 连接数据库(如果不存在会自动创建)
const db = new sqlite3.Database('myapp.db');

console.log('数据库连接成功!');
            

就像打开一个文件柜的抽屉

第二步:创建表格


// 创建用户表
db.run(`
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT UNIQUE,
        age INTEGER
    )
`);

console.log('用户表创建成功!');
            

搭建好数据的"房子框架"

第三步:插入数据


// 插入一个用户
db.run(
    "INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
    ['张三', 'zhangsan@email.com', 25],
    function(err) {
        if (err) {
            console.log('出错了:', err.message);
        } else {
            console.log('新用户ID:', this.lastID);
        }
    }
);
            

往文件柜里放入新档案

实际操作数据库

增删改查 - 数据库的四大天王 👑

增加数据 (CREATE)


// 批量插入多个用户
const users = [
    ['李四', 'lisi@email.com', 30],
    ['王五', 'wangwu@email.com', 28],
    ['赵六', 'zhaoliu@email.com', 35]
];

const stmt = db.prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");

users.forEach(user => {
    stmt.run(user, function(err) {
        if (!err) console.log(`添加用户成功,ID: ${this.lastID}`);
    });
});

stmt.finalize();
            

查询数据 (READ)


// 查询所有用户
db.all("SELECT * FROM users", [], (err, rows) => {
    if (err) {
        console.log('查询出错:', err.message);
    } else {
        console.log('所有用户:');
        rows.forEach(user => {
            console.log(`${user.id}: ${user.name} (${user.age}岁)`);
        });
    }
});

// 查询特定用户
db.get("SELECT * FROM users WHERE email = ?", ['zhangsan@email.com'], (err, row) => {
    if (row) {
        console.log('找到用户:', row.name);
    }
});
            

更新数据 (UPDATE)


// 更新用户年龄
db.run(
    "UPDATE users SET age = ? WHERE email = ?",
    [26, 'zhangsan@email.com'],
    function(err) {
        if (err) {
            console.log('更新失败:', err.message);
        } else {
            console.log(`更新了 ${this.changes} 条记录`);
        }
    }
);
            

就像修改档案里的信息

删除数据 (DELETE)


// 删除特定用户
db.run(
    "DELETE FROM users WHERE email = ?",
    ['unwanted@email.com'],
    function(err) {
        if (err) {
            console.log('删除失败:', err.message);
        } else {
            console.log(`删除了 ${this.changes} 条记录`);
        }
    }
);
            

小心使用,删除了就找不回来了!⚠️

完整的示例程序

把所有知识点串起来 🔗

完整代码示例


const sqlite3 = require('sqlite3').verbose();

// 创建数据库连接
const db = new sqlite3.Database('blog.db');

// 创建文章表
db.serialize(() => {
    // 创建表
    db.run(`CREATE TABLE IF NOT EXISTS articles (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        content TEXT,
        author TEXT,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )`);
    
    // 插入示例文章
    db.run("INSERT INTO articles (title, content, author) VALUES (?, ?, ?)",
        ['我的第一篇博客', '今天学会了用Node.js操作数据库!', '张三']);
    
    // 查询所有文章
    db.all("SELECT * FROM articles", [], (err, rows) => {
        if (!err) {
            console.log('博客文章列表:');
            rows.forEach(article => {
                console.log(`- ${article.title} (作者: ${article.author})`);
            });
        }
    });
});

// 关闭数据库连接
db.close((err) => {
    if (err) console.error(err.message);
    console.log('数据库连接已关闭');
});
            

最佳实践建议

写出更好的数据库代码 ✨

安全第一 🛡️

  • 使用参数化查询 - 防止SQL注入攻击
  • 验证输入数据 - 不要相信用户输入
  • 处理错误 - 程序崩溃不是好体验

// ✅ 好的做法 - 使用参数化查询
db.run("SELECT * FROM users WHERE email = ?", [userEmail]);

// ❌ 危险的做法 - 直接拼接字符串
db.run("SELECT * FROM users WHERE email = '" + userEmail + "'");
            

性能优化 🚀

  • 使用事务 - 批量操作更快
  • 关闭连接 - 释放系统资源
  • 索引优化 - 让查询飞起来

// 使用事务批量插入
db.serialize(() => {
    db.run("BEGIN TRANSACTION");
    
    users.forEach(user => {
        stmt.run(user);
    });
    
    db.run("COMMIT");
});
            

总结回顾

  • Node.js + 数据库 - 程序有了记忆
  • sqlite3 - 最适合新手的数据库包
  • 基本操作 - 连接、创建、增删改查
  • 安全实践 - 参数化查询防注入
  • 性能优化 - 事务和索引

恭喜!你已经掌握了数据库编程的基础! 🎉

下节课我们将学习更高级的数据库操作技巧