如何使用 @databricks/sql 向 Hive 编写参数化查询

问题描述 投票:0回答:2

我希望使用针对 Hive 数据库的 @databricks/sql npm 包编写参数化查询。对于 Postgres,我会做类似的事情

client.query('SELECT * FROM employee WHERE id == $1', [123]).then(res => {
  const data = res.rows;
});

使用 @databricks/sql npm 包,我能够使用提供的代码进行查询,如下所示

const queryString = `SELECT * FROM employee WHERE id = ${id}` // Bad
const queryOperation = await session.executeStatement(queryString, { runAsync: true });
await utils.waitUntilReady(
  queryOperation,
  false,
  () => {}
);

await utils.fetchAll(
  queryOperation
);

await queryOperation.close();

const result = utils.getResult(
  queryOperation
).getValue();

我正在努力寻找有关如何传递参数而不是字符串文字的文档。

javascript sql hive databricks
2个回答
1
投票

这个 python 小部件适合你吗?如果没有,那么我可以删除这个答案。

命令1:(定义变量)

%python
dbutils.widgets.text('score_date', '2021-01-01')

命令 2:(查询)

%sql 
select whatever
from database.table_name
where months_between('$score_date', service_date) <= 12

0
投票

根据驱动程序测试套件和 TypeScript 定义,您可以通过两种方式执行此操作。

第一个,带有命名参数:

const queryString = 'SELECT * FROM employee WHERE id = :myparam';
const queryOperation = await session.executeStatement(queryString, { runAsync: true, namedParameters: { myparam: 123 });

第二个,带有序数参数:

const queryString = 'SELECT * FROM employee WHERE id = ?';
const queryOperation = await session.executeStatement(queryString, { runAsync: true, ordinalParameters: [ 123 ]);

可以在此处找到这些类型的准备好的语句的测试文件: https://github.com/databricks/databricks-sql-nodejs/blob/3c29fe211663059a17b47b1f79ea3651c98a9cd7/tests/e2e/query_parameters.test.ts#L1

© www.soinside.com 2019 - 2024. All rights reserved.