我正在尝试执行这样的查询:
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的内容,请帮忙.
我正在尝试连接到我的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开发一个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) 从https://node-postgres.com/features/connecting,似乎我们可以选择Pool或Client执行查询
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,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) 我正在寻找一种有效的方法来获取一个原始的sql文件并让它与postgres数据库同步执行,类似于你运行它psql.
我有一个sql文件,它创建所有数据库,导入数据等.我需要使用node.js执行此操作,但找不到任何自动执行此操作的模块.对于node.js应用程序本身,我们使用node-postgres('pg'),knex.js和bookshelf.js.我认为虽然pg最适合这个.
我能想到的一个替代方案是读取整个文件,用分号分隔,用空格替换换行符,修剪任何重复的空格,然后以顺序执行的方式将其反馈到pg中,而不是异步执行.如果这是真正最有效的方式,并且如果还没有解决此问题的库存在,我会感到有些惊讶.我有点犹豫不决,因为SQL语法本身有点挑战,我可能会不小心把它混为一谈.
事先澄清一些:
psql 不能使用,因为它没有安装在目标机器上是否有任何描述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
由于感觉根本就没有规格,我已经开始致力于逆转它了.不确定它是否可以完全完成,因为从一些初始示例中通常不清楚应用了哪些格式规则.
我正在尝试使用 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
我在 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 文件以允许密码登录而不是 …
我有一些时间戳存储为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中的时区或覆盖此转换器.
node-postgres ×10
node.js ×8
postgresql ×6
javascript ×3
centos8 ×1
pg ×1
sequelize.js ×1
sql ×1
ssl ×1
tuples ×1