首页 > 解决方案 > typeorm querybuilder中的列名作为变量

问题描述

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

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 的列名中使用变量?

标签: typeorm

解决方案


我正在尝试类似的东西并在这里偶然发现了一个(不是特别好写的)解释: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 注入。

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


推荐阅读