使用pg-promise与PostgreSQL 9.5能否创建新数据库?连接报错咨询
在pg-promise中创建新数据库的正确姿势
嘿,我明白你现在的困惑了——pg-promise确实支持创建新数据库,但你踩了一个PostgreSQL连接的默认规则坑,咱们一步步来解决:
首先,你遇到的报错和Ubuntu用户名jeff有关,是因为PostgreSQL默认会用当前操作系统用户名作为数据库名来连接,当你不指定数据库名称时,它会尝试连接名为jeff的数据库,但这个数据库不存在,所以就报错了。
要创建新数据库,你得先连接到一个已经存在的数据库(PostgreSQL安装后自带的postgres数据库就是最佳选择,它是默认的管理数据库),然后在这个连接里执行创建新库的SQL。
具体步骤&代码示例
const pgp = require('pg-promise')(); // 第一步:先连接到自带的postgres数据库 const adminDb = pgp({ user: '你的PostgreSQL用户名', password: '你的密码', host: 'localhost', port: 5432, database: 'postgres' // 必须指定这个已存在的库 }); // 封装创建数据库的异步函数 async function createNewDatabase(dbName) { try { // 执行创建数据库的SQL,注意:这个操作不能在事务里执行 // 用pgp的转义方法避免SQL注入,尤其是动态传入库名时 await adminDb.none(`CREATE DATABASE ${pgp.as.escapeIdentifier(dbName)}`); console.log(`数据库 ${dbName} 创建成功!`); // 第二步:连接刚创建的新数据库 const newDb = pgp({ user: '你的PostgreSQL用户名', password: '你的密码', host: 'localhost', port: 5432, database: dbName }); // 测试新连接是否正常 const testResult = await newDb.one('SELECT 1 AS connection_test'); console.log('新数据库连接正常,测试结果:', testResult); return newDb; } catch (err) { console.error('创建数据库时出错:', err); throw err; } finally { // 用完管理连接后关闭连接池(如果不需要再用的话) adminDb.$pool.end(); } } // 调用函数创建你的目标数据库 createNewDatabase('my_custom_db');
几个关键注意点
- 绝对不能跳过“先连接已有数据库”这一步:PostgreSQL不允许在未连接到任何数据库的状态下执行创建库的操作,这是数据库本身的限制,和pg-promise无关。
- 不要在事务中执行
CREATE DATABASE:PostgreSQL的这个命令不支持事务上下文,所以直接用none()方法执行即可。 - 一定要转义数据库名:如果你的数据库名包含特殊字符或者是动态生成的,
pgp.as.escapeIdentifier()能帮你避免SQL注入风险,同时符合PostgreSQL的标识符规则。
内容的提问来源于stack exchange,提问作者Hawkeye64
相关产品推荐
相关产品推荐

