typeorm - 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 的列名中使用变量?
解决方案
我正在尝试类似的东西并在这里偶然发现了一个(不是特别好写的)解释: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 注入。
如果您想动态设置列名、表名等,这确实会留下模板字符串或字符串连接。但是,出于同样的原因,这种保护措施首先存在,我会避免在用户输入时这样做。
推荐阅读
- python - 我想知道,哪一组特定的列具有 Null 值
- javascript - 为什么document.location.host的属性中没有“可写”和“值”
- python-3.x - 如何在类函数之间传递变量?
- ios - 为什么可以编译这样的代码?在 iOS UIViewController 中调用 popToRootViewControllerAnimated?
- macos - macOS L2CAP 蓝牙插座
- java - Spring JPA:导致预期加入的路径
- r - 只有当另一个公共变量的值相等时,是否有一个 R 函数可以用另一个数据帧中的值替换一个数据帧中的值?
- eos - 如何确定是否需要创建钱包?
- r - Calculating probability using simulation
- vega - 有没有办法在 vega 重复图中的 vega 表达式中使用图号/标识符?