【问题标题】:How to drop and then recreate database with pg-promise?如何使用 pg-promise 删除然后重新创建数据库?
【发布时间】:2021-08-11 11:41:15
【问题描述】:

我希望能够从代码中重置我的数据库,方法是先删除数据库,然后重新创建它,然后重新创建所有表,然后用数据重新填充它。

但如果我只是这样做:

await db.any('DROP DATABASE $1',cn.database)

我收到以下错误:

error: syntax error at or near "'testdb'"

很可能是因为我试图删除我当前连接的数据库。

那么有没有办法在运行时使用 pg-promise 删除或重置数据库?

【问题讨论】:

  • 好吧,很明显连接到不同的数据库。
  • 因为我正在尝试删除我当前连接的数据库” - 不,这是语法错误,而不是执行错误。
  • @RichardHuxton 这是否意味着我需要为每个服务器添加一个空的回避数据库?似乎是一种不好的做法。我不能像在命令行上那样以某种方式存在当前的数据库吗?
  • @vitaly-t 删除所有表需要知道有哪些表,并且经常会错过函数、序列、类型、自定义运算符等等。我发现一个很好的折衷方案是删除并重新创建应用程序正在使用的模式,这会捕获大多数数据库对象(但不包括扩展、事件、排序规则、复制和其他数据库级配置)
  • @user2741831 是的,对不起,它默认为数据库postgres。或者准确地说,它使用与用户名相同的数据库 - 请参阅here

标签: node.js postgresql pg-promise


【解决方案1】:

在 SQL 语法中,数据库名称是标识符,而不是值文字。您需要使用SQL Name filter

await db.none('DROP DATABASE $1~', cn.database);
// or
await db.none('DROP DATABASE $1:name', cn.database);
// or
await db.none('DROP DATABASE ${database:name}', cn);

【讨论】:

  • 谢谢,但现在我得到了正确的错误“无法删除当前打开的数据库”。但是出于好奇,字符串是否经过了清理,这意味着我不必担心 sql 注入?
  • @user2741831 这就是 pg-promise 库的过滤器所做的,是的 - 它不像 'DROP DATABASE ' + cn.database
  • @user2741831 "现在我得到了正确的错误 "无法删除当前打开的数据库"" - 正如 RichardHuxton 所说,要删除一个数据库,您需要连接到不同的数据库,通常是集群的"maintenance" database
猜你喜欢
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2018-08-19
  • 2013-06-04
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多