如何从node.js向Vertica查询传递数组作为参数?

jei2mxaa  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(171)

我正在尝试对vertica数据库执行sql查询。到目前为止还有效但是为了防止SQL注入,我想使用参数化查询。看起来vertica支持的参数为?(与postgres的$1, $2, ...相比)
所以参数工作,但如果参数是一个值数组,则不工作(用于IN (...)条件)

  • 任何想法如何解决这个问题?*

假设我有一个用户ID列表和一个名称:

const userIds = [1, 2, 3];
const name = 'robert'

postgres db(工作中!)

使用pg包:

const pool = new pg.Pool({ /* config */ });
const client = await pool.connect();

const { rows } = client.query(`
  SELECT * FROM users WHERE first_name = $1 AND user_id = ANY($2);
`, [name, userIds]);

使用postgres

const sql = postgres({ /* postgres db config */ });
const rows = await sql`
  SELECT * FROM users WHERE first_name = ${name} AND user_id = ANY(${userIds});
`;

vertica db(无法工作)

仅当userIds作为单个值传递时有效,而不是1+值的数组
使用vertica-nodejs

import Vertica from 'vertica-nodejs';
const { Pool } = Vertica;
const pool = new Pool({ /* vertica db config */ });

const res = await pool.query(`
  SELECT * FROM users WHERE first_name = ? AND user_id IN (?);
`, [name, userIds]);

// -> Invalid input syntax for integer: "{"1","2","3"}"

使用vertica
似乎根本不支持参数,只是提供了一个函数(quote)来在字符串插值之前清理它们。
使用pg

const pool = new pg.Pool({ /* vertica db config */ });
const client = await pool.connect();

const { rows } = client.query(`
  SELECT * FROM users WHERE first_name = ? AND user_id IN (?);
`, [name, userIds]);

// -> Invalid input syntax for integer: "{"1","2","3"}"

使用postgres
(似乎根本不支持连接到vertica db)

const sql = postgres({ /* vertica db config */ });
const rows = await sql`
  SELECT * FROM users;
`;

// -> Schema "pg_catalog" does not exist

我也尝试了这些变体而不是user_id IN (?)

  • user_id IN (?::int[])->操作员不存在:int = array[int]
  • 您访问的页面不存在
  • 您访问的页面不存在
ct2axkht

ct2axkht1#

试试ANY (ARRAY [$1])我不知道node.js或SQL注入,但在bash shell中似乎可以工作:

marco ~/1/Vertica/supp $ cat test.sh      
#!/usr/bin/env zsh
vsql -c "
SELECT cust_id,cust_from_dt,cust_fname,cust_lname 
FROM scd.d_customer_scd 
WHERE cust_id = ANY(ARRAY[$1]) 
ORDER BY 1,2"
marco ~/1/Vertica/supp $ ./test.sh 1,2,3
 cust_id | cust_from_dt | cust_fname | cust_lname 
---------+--------------+------------+------------
       1 | 2021-12-05   | Arthur     | Dent
       1 | 2021-12-15   | Arthur     | Dent
       1 | 2021-12-22   | Arthur     | Dent
       1 | 2021-12-29   | Arthur     | Dent
       2 | 2021-12-05   | Ford       | Prefect
       3 | 2021-11-05   | Zaphod     | Beeblebrox
       3 | 2021-12-15   | Zaphod     | Beeblebrox
       3 | 2021-12-22   | Zaphod     | Beeblebrox
       3 | 2021-12-29   | Zaphod     | Beeblebrox
(9 rows)

marco ~/1/Vertica/supp $

相关问题