列名在typeorm querybuilder中作为变量

时间:2020-04-15 04:38:15

标签: typeorm

这是我的原始代码,不起作用。

this.createQueryBuilder().where(
      'LOWER(:column) LIKE LOWER(:name)',
      { column: 'itemName', name: `%${options.name}%` }
    );
{ "total": 0, "results": [] }

上述查询没有任何结果,但是当我像这样将列名显式放置在查询中时,它会起作用:

this.createQueryBuilder().where(
      'LOWER(itemName) LIKE LOWER(:name)',
      { name: `%${options.name}%` }
    );
{"total":9, "results": [<RESULTS GOES HERE>] }

是否可以在列名中为typeorm使用变量?

2 个答案:

答案 0 :(得分:1)

我正在尝试类似的东西,并在这里偶然发现了一个(写得不是特别好)的解释:https://www.tutorialspoint.com/typeorm/typeorm_query_builder.htm

基本上,参数是为了防止 SQL 注入,所以虽然很难看到幕后发生了什么,但我猜任何字符串参数都会在最终查询中自动用单引号括起来,所以它不能解释为值以外的任何内容。

我什至尝试将参数用单引号括起来,例如

this.createQueryBuilder.where(
    '":columnName" = :value',
    { columnName: 'my_column': value: 'my_value' }
);

不好。这完全阻止了参数替换并给出了错误 QueryFailedError: column "$1" does not exist 并且似乎确认此功能旨在防止 SQL 注入。

如果您想动态设置列名、表名等,这确实会保留模板字符串或字符串连接。但是,出于同样的原因,首先存在此保护措施,我将避免在用户输入时这样做。< /p>

答案 1 :(得分:0)

是的,但有一些缺点。

将查询构建为字符串并在Where函数中进行解析

const query = `{ "${field}": ${value} }`
this.createQueryBuilder.where( JSON.parse(query) )

如果您想做更复杂的事情,应该照常编写,但是要使用字符串格式。