是否可以使用 pg-promise 和 PostgreSQL(9.5)“创建数据库 ...”?

Posted

技术标签:

【中文标题】是否可以使用 pg-promise 和 PostgreSQL(9.5)“创建数据库 ...”?【英文标题】:Is it possible to "CREATE DATABASE ..." with pg-promise and PostgreSQL (9.5)? 【发布时间】:2018-08-19 21:19:20 【问题描述】:

问题是:

1) Can pg-promise be used to create a new database (schemas, et. al.)?

使用节点包 'pg-promise' 我似乎无法确定是否可以创建一个新数据库。我可以连接到现有数据库并且那里没有问题。但是,当我在没有数据库名称的情况下运行时,会出现错误:

这就是我正在尝试的:

host = host || '127.0.0.1'
port = port || '5432'

const pgp = require('pg-promise')(pgpInitOptions)

// database connection details
const pgConnectionOptions = 
  host: host,
  port: port,
  user: user,
  password: pass


// database instance
const localDB = pgp(pgConnectionOptions)

let escapedDbName = dbName.replace(/\"/g, '""');
let sql = 'CREATE DATABASE "' + escapedDbName + '"';

localDB
.any(sql)
.then((results) => 
  console.log('creation of database successful', results)
)
.catch((error) => 
  console.error('creation of database failed', error)
)

然后,我收到此错误:

creation of database failed
Error: database "jeff" does not exist

“jeff”是我的 ubuntu 登录名。

【问题讨论】:

您提供的凭据有问题。您必须使用有效的数据库帐户,即安装 PostgreSQL 服务器时使用的管理用户 + 密码,该帐户将具有创建新数据库的访问权限。那么它应该就可以工作了。 对不起,我应该提到它们是作为变量传入的。 【参考方案1】:

首先,您需要使用有权创建新数据库的管理员帐户连接到现有数据库。

然后您可以通过常规查询创建新数据库...

const pgp = require('pg-promise')(/* initialization options */);

const db = pgp(
    database: 'any-existing-db',
    port: 5432,
    user: 'postgres', // any admin user
    password: 'admin-password'
);
    
await db.none('CREATE DATABASE $1:name', ['my_database']);

我在本地运行这样的代码,它运行良好。

【讨论】:

以上是关于是否可以使用 pg-promise 和 PostgreSQL(9.5)“创建数据库 ...”?的主要内容,如果未能解决你的问题,请参考以下文章

将 pg-promise 任务与 graphql 和 dataloader 一起使用

使用 pg-promise 的连接池

Pg-promise插入/事务在异步队列中不起作用

使用 pg-promise 记录特定的 postgresql 查询

使用 pg-promise 格式化 JSON 输出,将外键封装为对象

我应该在哪里初始化 pg-promise