如何通过Knex迁移实现数据库创建?附配置及迁移文件示例
用Knex实现数据库创建的迁移方案
完全同意你的思路——从项目首次数据库交互就启用迁移绝对是个明智的选择,能让数据库结构的变更全程可追踪、可回滚,避免手动操作带来的混乱。针对你创建数据库的迁移需求,我来帮你完善代码并补充关键细节:
1. 配置文件优化(knexfile.js)
你的基础配置已经搭建好了,但要注意:创建新数据库时,Knex需要先连接到一个已存在的默认数据库(比如PostgreSQL自带的postgres库),所以建议补充完整连接信息:
'use strict'; require('dotenv').config({ path: 'process.env' }); const config = { client: 'pg', connection: { host: process.env.DB_URL, database: 'postgres', // 连接到默认存在的数据库 user: process.env.DB_USER, password: process.env.DB_PASSWORD }, }; module.exports = config;
2. 完整的数据库迁移文件
你的up方法已经正确用knex.raw执行了创建数据库的SQL,现在完善down方法(回滚操作)——删除数据库前要先断开所有活跃连接,否则会报错:
'use strict'; exports.up = function(knex, Promise) { // 创建名为asd的数据库 return knex.raw('CREATE DATABASE asd'); }; exports.down = function(knex, Promise) { // 先终止所有连接到asd的会话,再删除数据库 return knex.raw(` SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'asd'; `).then(() => { return knex.raw('DROP DATABASE asd'); }); };
几个重要提醒:
- 确保执行迁移的PostgreSQL用户拥有创建/删除数据库的权限,否则会抛出权限错误。
- 运行这个迁移后,Knex的系统表(
knex_migrations、knex_migrations_lock)会被创建在你配置的默认数据库(比如postgres)里。如果之后要在asd数据库中管理表结构,记得修改knexfile.js的connection.database为asd,再创建新的迁移文件来定义表结构。 - 执行迁移的命令还是常规的
knex migrate:latest,回滚则用knex migrate:rollback。
内容的提问来源于stack exchange,提问作者Bence Gedai
相关产品推荐
相关产品推荐

