标签: node-postgres

node-postgres:如何执行"WHERE col IN(<动态值列表>)"查询?

我正在尝试执行这样的查询:

SELECT * FROM table WHERE id IN (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

问题是我要过滤的ID列表不是常量,每次执行时都需要不同.我还需要逃避id,因为它们可能来自不受信任的来源,尽管我实际上会逃避查询中的任何内容,无论源的可信度如何.

节点的Postgres似乎与绑定参数专门工作:client.query('SELECT * FROM table WHERE id = $1', [ id ]); 如果我有一个已知数量的值(client.query('SELECT * FROM table WHERE id IN ($1, $2, $3)', [ id1, id2, id3 ])),但是不能直接使用数组,这将有效:client.query('SELECT * FROM table WHERE id IN ($1)', [ arrayOfIds ])因为似乎没有任何特殊的数组参数处理.

根据数组中项目的数量动态构建查询模板,并将ids数组扩展到查询参数数组(在我的实际情况下,除了id列表之外还包含其他参数)似乎是不合理的负担.在查询模板中对id列表进行硬编码似乎也不可行,因为node-postgres不提供任何值转义方法.

这似乎是一个非常常见的用例,所以我的猜测是我实际上忽略了某些东西,而不是不可能将常见的IN (values)SQL运算符与node-postgres一起使用.

如果有人以比我上面列出的方式更优雅的方式解决了这个问题,或者如果我真的错过了关于node-postgres的内容,请帮忙.

node.js node-postgres

55
推荐指数
4
解决办法
3万
查看次数

用于PostgreSQL连接nodejs的SSL

我正在尝试连接到我的Heroku PostgreSQL数据库,并且我一直收到SSL错误.有没有人知道如何在连接字符串中启用SSL?

postgres://user:pass@host:port/database;

一直在寻找它,但它似乎不是一个非常受欢迎的话题.顺便说一句,我正在运行Nodejs和node-pg模块及其connection-pooled方法:

pg.connect(connString, function(err, client, done) { /// Should work. });

评论非常感谢.

postgresql ssl node.js node-postgres

34
推荐指数
4
解决办法
2万
查看次数

连接到Heroku PostgreSQL数据库时出现身份验证错误

我正在使用PostgreSQL开发一个Node.js应用程序并在Heroku上托管.我的问题是我收到了如下身份验证错误:

14:32:05 web.1     | { [error: no pg_hba.conf entry for host "193.40.244.196", user "username", database "database_name", SSL off]
14:32:05 web.1     |   length: 168,
14:32:05 web.1     |   name: 'error',
14:32:05 web.1     |   severity: 'FATAL',
14:32:05 web.1     |   code: '28000',
14:32:05 web.1     |   detail: undefined,
14:32:05 web.1     |   hint: undefined,
14:32:05 web.1     |   position: undefined,
14:32:05 web.1     |   internalPosition: undefined,
14:32:05 web.1     |   internalQuery: undefined,
14:32:05 web.1     |   where: undefined,
14:32:05 web.1     |   file: 'auth.c',
14:32:05 web.1     |   line: '483',
14:32:05 web.1 …
Run Code Online (Sandbox Code Playgroud)

authentication postgresql node.js node-postgres

27
推荐指数
5
解决办法
1万
查看次数

如何在客户端或池之间选择节点postgres

https://node-postgres.com/features/connecting,似乎我们可以选择PoolClient执行查询

pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})
Run Code Online (Sandbox Code Playgroud)
client.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  client.end()
})
Run Code Online (Sandbox Code Playgroud)

它们的功能看起来非常相似.但是,文档并没有解释Pool和之间的差异Client.

可我知道,我应该考虑什么东西,之间做选择之前Pool还是Client

node.js node-postgres

26
推荐指数
2
解决办法
8059
查看次数

什么时候断开连接以及何时结束pg客户端或池

我的堆栈是node,express和pg模块.我真的试图通过文档和一些过时的教程来理解.我不知道何时以及如何断开连接并结束客户端.

对于某些路线,我决定使用游泳池.这是我的代码

const pool = new pg.Pool({
  user: 'pooluser',host: 'localhost',database: 'mydb',password: 'pooluser',port: 5432});

pool.on('error', (err, client) => {
  console.log('error ', err);  process.exit(-1);
});

app.get('/', (req, res)=>{
  pool.connect()
    .then(client => {
      return client.query('select ....')
            .then(resolved => {
              client.release();
              console.log(resolved.rows);
            })
            .catch(e => { 
              client.release();
              console.log('error', e);
            })
      pool.end();
    })
});
Run Code Online (Sandbox Code Playgroud)

在CMS的路由中,我使用客户端而不是具有与池不同的数据库权限的池.

const client = new pg.Client({
  user: 'clientuser',host: 'localhost',database: 'mydb',password: 'clientuser',port: 5432});    
client.connect();

const signup = (user) => {
  return new Promise((resolved, rejeted)=>{
    getUser(user.email)
    .then(getUserRes => {
      if (!getUserRes) { …
Run Code Online (Sandbox Code Playgroud)

postgresql node.js pg node-postgres

24
推荐指数
4
解决办法
9515
查看次数

在node.js中导入sql文件并对PostgreSQL执行

我正在寻找一种有效的方法来获取一个原始的sql文件并让它与postgres数据库同步执行,类似于你运行它psql.

我有一个sql文件,它创建所有数据库,导入数据等.我需要使用node.js执行此操作,但找不到任何自动执行此操作的模块.对于node.js应用程序本身,我们使用node-postgres('pg'),knex.js和bookshelf.js.我认为虽然pg最适合这个.

我能想到的一个替代方案是读取整个文件,用分号分隔,用空格替换换行符,修剪任何重复的空格,然后以顺序执行的方式将其反馈到pg中,而不是异步执行.如果这是真正最有效的方式,并且如果还没有解决此问题的库存在,我会感到有些惊讶.我有点犹豫不决,因为SQL语法本身有点挑战,我可能会不小心把它混为一谈.

事先澄清一些:

  • psql 不能使用,因为它没有安装在目标机器上
  • 我选择以sql本机形式开发和源代码控制sql语句,因为DBA使用和操作它更容易

javascript sql postgresql node.js node-postgres

18
推荐指数
2
解决办法
2万
查看次数

PostgreSQL元组格式

是否有任何描述PostgreSQL服务器遵循的元组格式的文档?官方文件似乎对此很神秘.

单个元组似乎很容易弄明白,但是当涉及元组数组,复合元组数组,以及最后嵌套的复合元组数组时,仅通过查看输出就无法确定格式.

在我最初尝试实现pg-tuple(一个今天仍然缺少的解析器)之后,我要问这个能够解析Node.js中的PostgreSQL元组


例子

create type type_A as (
   a int,
   b text
);
Run Code Online (Sandbox Code Playgroud)
  • 用简单的文字: (1,hello)
  • 复杂的文字: (1,"hello world!")

create type type_B as (
   c type_A,
   d type_A[]
);
Run Code Online (Sandbox Code Playgroud)
  • 简单值数组: {"(2,two)","(3,three)"}

  • 因为type_B[]我们可以得到:

{"(\"(7,inner)\",\"{\"\"(88,eight-1)\"\",\"\"(99,nine-2)\"\"}\")","(\"(77,inner)\",\"{\"\"(888,eight-3)\"\",\"\"(999,nine-4)\"\"}\")"}

对于复合类型的多维数组,它变得更加复杂.


UPDATE

由于感觉根本就没有规格,我已经开始致力于逆转它了.不确定它是否可以完全完成,因为从一些初始示例中通常不清楚应用了哪些格式规则.

postgresql tuples composite-types node-postgres

15
推荐指数
1
解决办法
2327
查看次数

node-postgres,连接意外终止

我正在尝试使用 node-postgres 连接到远程数据库。

我可以使用 psql 客户端进行连接,但在尝试运行此程序时出现错误Connection terminated unexpectedly(使用与 psql 客户端相同的连接字符串):

const { Pool, Client } = require('pg')
const connectionString = '...'

const pool = new Pool({
  connectionString: connectionString,
})

pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})

const client = new Client({
  connectionString: connectionString,
})
client.connect()

client.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  client.end()
})
Run Code Online (Sandbox Code Playgroud)

我也一直在尝试连接 Sequelize ORM,但遇到了同样的错误。

@编辑

使用本机模式修复了使用 pg 和 Sequelize 进行客户端查询的问题

const { Pool, Client } = require('pg').native

javascript node.js sequelize.js node-postgres

15
推荐指数
3
解决办法
5万
查看次数

使用nodejs程序连接时出现错误:connect ECONNREFUSED 127.0.0.1:5432

我在 CentOS 8 机器上设置了一个 postgresql 服务器,并使用该pg库在同一台机器上运行一个 js 程序。

const { Pool } = require('pg')

const pool = new Pool({
    user: process.env.PG_USER,      //postgres user
    host: process.env.PG_ENDPOINT,  //localhost (I also tried 127.0.0.1)
    database: process.env.PG_DB,    //database name to connect to
    password: process.env.PG_PASS,  //postgres user password
    port: process.env.PG_PORT       //5432
});
Run Code Online (Sandbox Code Playgroud)

我正确设置了 pg 池,如果我想将其连接到我的 AWS postgres 服务器(当然,具有正确的端点等),它工作得很好,但是当我尝试让它连接到 postgres 服务器时,我在同一台机器上设置时,出现以下错误:

Error: connect ECONNREFUSED 127.0.0.1:5432
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 5432
}
Run Code Online (Sandbox Code Playgroud)

我按照说明设置 pg_hba.conf 文件以允许密码登录而不是 …

javascript node-postgres postgresql-12 centos8

15
推荐指数
1
解决办法
11万
查看次数

使用node-postgres在utc中获取Postgres"没有时区的时间戳"

我有一些时间戳存储为Postgres类型timestamp without time zone.

我将使用时间戳2013-12-20 20:45:27作为示例.我打算这表示UTC时间戳.

在psql中,如果我运行查询SELECT start_time FROM table_name WHERE id = 1,我会按预期返回该时间戳字符串:2013-12-20 20:45:27.

但是,如果在我的Node应用程序中,我使用node-postgres库来运行相同的查询,我会在本地时区获得一个时间戳:Fri Dec 20 2013 20:45:27 GMT-0600 (CST).这是一个Javascript日期对象,但它已经存储为该时区.我真正想要的是一个代表的日期对象(甚至只是一个字符串)2013-12-20 20:45:27 GMT+0000.我已经知道这次是UTC.

我已经尝试将postgresql.conf文件中的timezone param设置为:timezone = 'UTC',结果没有区别.

我究竟做错了什么?

编辑

问题似乎出现在这个文件中:https://github.com/brianc/node-postgres/blob/master/lib/types/textParsers.js

如果从Postgres返回的日期字符串没有指定时区(Z或者+06:30,那么它只是构造一个JavaScript日期对象,我相信它只包含本地时区.我要么将我的应用程序更改为存储DB中的时区或覆盖此转换器.

postgresql node.js node-postgres

14
推荐指数
3
解决办法
1万
查看次数