不使用ORM如何优雅管理数据库更新
1. 数据库初始化和迁移的核心思想
与普通项目相比,Next.js 的数据库管理需要结合其文件结构和 API 路由来实现。以下是几个关键点:
- 数据库初始化:可以在项目启动时(如通过一个特定的 API 路由或脚本)执行数据库初始化操作。
- 数据库迁移:通过编写脚本或 API 路由管理迁移脚本的执行。
- 自动化:利用 Next.js 的全栈能力,结合 Node.js 脚本,自动检测和执行迁移。
2. 在 Next.js 中实现数据库初始化
方法 1:通过脚本初始化数据库
可以在 Next.js 项目根目录编写一个脚本(如 scripts/init-db.js),用于初始化数据库。
示例:scripts/init-db.js
const { Client } = require('pg'); // 使用 pg 库连接 PostgreSQL
const initDB = async () => {
const client = new Client({
user: 'postgres',
host: 'localhost',
database: 'your_database',
password: 'your_password',
port: 5432,
});
try {
await client.connect();
// 创建表
await client.query(`
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
`);
await client.query(`
CREATE TABLE IF NOT EXISTS posts (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (id)
);
`);
// 插入初始数据
await client.query(`
INSERT INTO users (username, password, email) VALUES
('admin', 'hashed_password', 'admin@example.com')
ON CONFLICT (username) DO NOTHING;
`);
console.log('Database initialized successfully!');
} catch (error) {
console.error('Error initializing database:', error);
} finally {
await client.end();
}
};
initDB();
运行脚本:
node scripts/init-db.js