我正在编写一个sql查询,其中我从用户那里获取SQL查询的键/列名称,当我在python中编写参数化查询时,我得到的键名称为$1,$2,而不是我想要的名称专栏。
我已经在我的 python sdk 中为 cosmos db 尝试过这个,没有 sql
queryText ="SELECT @id ,c.source_name,c.field_name FROM c"
item_list = list(container.query_items(query=queryText,parameters=[{"name":'@id','value':'id_name'}],enable_cross_partition_query=True))
在输出中我得到的值为
[{'$1': 'id_value',
'source_name': 'source_name_value',
'field_name': 'field_name_value'},
.......
]
但我希望将“$1”替换为字符串“id_name” 我无法在我的 python 中更改名称,因为我有很多列,上面的代码只是为了理解上下文,并且我返回了大量数据。因此更改脚本中的数据将需要大量时间计算。 SQL 查询的字符串连接也有可能在我的应用程序中进行 SQL 注入
使用参数这是不可能的。如果您希望对查询进行动态投影,则需要在发送到服务之前构建具有要在文本本身中投影的属性的 SQL 字符串。
Cosmos SQL 语法是只读的,限制了 SQL 注入的影响。在 Cosmos 中无法使用 SQL 插入/更新/删除数据/容器/数据库。
如果您正在尝试构建一个自由格式的查询功能,该功能使用文档中实际属性名称的别名,那么您将需要使用键值查找来构建某种模式管理来构造查询字符串,然后将其发送到要执行的服务。您可以将其本身存储在 Cosmos 容器中,并使用点读取来获取数据并存储在内存中,以便在运行时快速查找。
这里需要注意的一个方面是,如果设计不正确,这种类型的用户查询功能通常会出现性能问题。避免大量跨分区查询非常重要,特别是对于具有大量数据的容器。常见的解决方案是拥有多个容器,这些容器可以将用户的查询路由到带有分区键的正确容器,这些分区键可以在分区内运行查询,而不是跨分区。另一种技术是拥有一个包含小数据子集的查找容器,可以为正在搜索的数据提供分区键和 id 值(或查询的过滤谓词值)。您还可以在这里应用许多其他技术。
关键是,如果您希望它可扩展且高效,您需要执行以下操作:
无论您在 Cosmos 中做什么,这些步骤都适用。 Cosmos 的设计目标是极其快速、高效和大规模可扩展,但您必须应用正确的设计原则才能利用它。