首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQLKorma中表示(参数化)对Postgres的任何(数组)查询

在SQLKorma中表示(参数化)对Postgres的任何(数组)查询
EN

Stack Overflow用户
提问于 2015-05-04 18:24:39
回答 1查看 259关注 0票数 2

目前,我正在一个项目中使用SQLKorma,并且遇到了一些麻烦。

我用两个左联接构造了一个查询;其中一个包含一个数组,其中一个数组包含我希望在我的WHERE子句中使用的条目。

这在SQL中是微不足道的。请注意,这是一个主要经过修改的查询。

代码语言:javascript
复制
SELECT
  cu.name,
  c.description,
  c.created_at AT TIME ZONE 'utc'
FROM calendar_users cu LEFT JOIN calendars c ON cu.id = c.user_id
  LEFT JOIN meetings m ON c.id = m.id
WHERE 'status_report' ILIKE ANY (m.meeting_metadata)
GROUP BY m.meeting_metadata, c.created_at, cu.name, cu.description
ORDER BY c.created_at DESC

关于ILIKE ANY的部分是我希望能够翻译到Korma的部分。

我从医生那里了解到表示ANY子句不受WHERE子句的支持,我应该研究使用rawexec-raw

这样,我想将一个参数化的raw字符串传递到WHERE子句中,以完成我想要实现的任务。

我尝试过这样做,但在Postgres中出现语法错误时,它确实失败了:

代码语言:javascript
复制
(select calendars
    (fields calendar-user-cols)
    (join :calendar_users (= :calendars.user_id :calendar_users.id))
    (join :meetings (= :calendars.id :meetings.id))
    (where (raw ["? ILIKE ANY(meetings.meeting_metadata)" metadata])))

具体地说:

代码语言:javascript
复制
PSQLException:
 Message: ERROR: syntax error at or near "["
  Position: 1006
 SQLState: 42601
 Error Code: 0

我该怎么用Korma来做这件事?我必须求助于一个全面的exec-raw查询吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-04 23:43:10

Korma有一个非常有用的函数korma.core/sql-only,它将呈现将要执行的SQL字符串。

代码语言:javascript
复制
(defentity calendars)
=> #'korma-test.core/calendars

(sql-only
  (select calendars
          (fields :x :y)
          (join :calendar_users (= :calendars.user_id :calendar_users.id))
          (join :meetings (= :calendars.id :meetings.id))
          (where (raw ["? ILIKE ANY(meetings.meeting_metadata)" "status_report"]))))
=> "SELECT \"calendars\".\"x\", \"calendars\".\"y\" FROM (\"calendars\" LEFT JOIN \"calendar_users\" ON \"calendars\".\"user_id\" = \"calendar_users\".\"id\") LEFT JOIN \"meetings\" ON \"calendars\".\"id\" = \"meetings\".\"id\" WHERE [\"? ILIKE ANY(meetings.meeting_metadata)\" \"status_report\"]"

或者是更易读的:

代码语言:javascript
复制
SELECT "calendars"."x",
       "calendars"."y"
FROM ("calendars"
      LEFT JOIN "calendar_users" ON "calendars"."user_id" = "calendar_users"."id")
LEFT JOIN "meetings" ON "calendars"."id" = "meetings"."id"
WHERE ["? ILIKE ANY(meetings.meeting_metadata)" "status_report"]

如您所见,ILIKE被[]包围。Korma的raw只是一个原始字符串,不像exec-raw那样支持参数化。ILIKE字符串周围的向量刚刚转化为一个包含其内容的字符串。这就是关于[的Postgres错误的原因。

如果您想继续使用[],或者查看exec-raw是否能更好地满足您的需要,就需要从ILIKE字符串周围删除exec-raw。如果您使用的是“raw”,那么就存在SQL注入的危险,尽管您需要解决这个问题。

代码语言:javascript
复制
;; require clojure.string :as str in your ns
;; change your clause from
(where (raw ["? ILIKE ANY(meetings.meeting_metadata)" "status_report"])))
;; to this
(where (raw (str/join " " ["'status_report'" "ILIKE ANY(meetings.meeting_metadata)"])))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30037235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档