首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表中缺少-子句条目吗?

表中缺少-子句条目吗?
EN

Stack Overflow用户
提问于 2018-04-17 11:08:42
回答 2查看 764关注 0票数 0

当我从一个有很多关系的表中选择一个特定的字段时,我会得到一个异常,如:org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table \"bar\"

以下是我定义的关系:

代码语言:javascript
复制
(declare foo bar)

(korma/defentity foo
                 (korma/pk :token)
                 (korma/database db)
                 (korma/table :foo)
                 (korma/has-many bar {:fk :token}))

(korma/defentity bar
                 (korma/pk :token)
                 (korma/database db)
                 (korma/table :bar)
                 (korma/belongs-to foo {:fk :token}))

下面是在sqlkorma中生成的查询:

代码语言:javascript
复制
(defn fetch []
  (->
    (korma/select* foo)
    (korma/with bar)
    (korma/fields :foo.token :bar.col)
    (korma/exec)))

如果我选择了与*一起使用的所有字段,那么查询就没有问题。但是,我想指定我要选择的字段,我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-18 14:33:12

想想看,我在错误的地方传递了bar.col字段。我想,因为这是一种有很多关系,所以sql必须离开这里,在这里运行n+1查询。这解释了为什么我会看到一个missing FROM-clause异常,因为我告诉sql在错误的查询中获取一个字段。

代码语言:javascript
复制
(defn fetch []
  (->
    (korma/select* foo)
    (korma/fields :token)
    (korma/with bar (korma/fields :col))
    (korma/exec)))
票数 0
EN

Stack Overflow用户

发布于 2018-04-17 13:45:40

我放弃了和科玛一起做这件事。我认为您最好使用基本SQL互操作:

代码语言:javascript
复制
(ns tst.demo.jdbc
  (:use demo.core tupelo.core tupelo.test)
  (:require
    [clojure.java.jdbc :as jdbc]
    [clojure.string :as str]
    [clojure.java.io :as io] ))

(def db {:classname   "org.h2.Driver"
         :subprotocol "h2:mem"
        ;:subname     "./korma.db"
         :subname     "demo;DB_CLOSE_DELAY=-1" ; -1 very important!!!
                          ; http://www.h2database.com/html/features.html#in_memory_databases
                          ; http://makble.com/using-h2-in-memory-database-in-clojure
         :user "sa"
         :password ""
         })

(dotest
  (spyx (jdbc/db-do-commands db ["drop table if exists langs"]))
  (spyx (jdbc/db-do-commands db ["drop table if exists releases"]))
  (spy :create
       (jdbc/db-do-commands
         db
         (jdbc/create-table-ddl :langs
                                [[:id :serial]
                                 [:lang "varchar not null"]])))
  (spy :create
       (jdbc/db-do-commands
         db
         (jdbc/create-table-ddl :releases
                                [[:id :serial]
                                 [:desc "varchar not null"]
                                 [:langId "numeric"]])))
  (spy :insert
       (jdbc/insert-multi! db :langs
                           [{:lang "Clojure"}
                            {:lang "Java"}]))
  ;; -> ({:lang "Clojure", :id 1} {:lang "Java", :id 2})
  (spyx-pretty (jdbc/query db ["select * from langs"]))

  (let [clj-id (grab :id (only (jdbc/query db ["select id from langs where lang='Clojure'"])))]
    (spyx clj-id)
    (spy :insert-rel
         (jdbc/insert-multi! db :releases
                             [{:desc "ancients" :langId clj-id}
                              {:desc "1.8" :langId clj-id}
                              {:desc "1.9" :langId clj-id}])) )
  (let [java-id (grab :id (only (jdbc/query db ["select id from langs where lang='Java'"])))]
    (spyx java-id)
    (spy :insert-rel
         (jdbc/insert-multi! db :releases
                             [{:desc "dusty" :langId java-id}
                              {:desc "8" :langId java-id}
                              {:desc "9" :langId java-id}
                              {:desc "10" :langId java-id}])) )
  (spyx-pretty
   (jdbc/query db [
   "select langs.lang, releases.desc
       from langs inner join releases
       on (langs.id = releases.langId)
       where lang = 'Clojure' "]) )
  )

其结果是:

代码语言:javascript
复制
(jdbc/db-do-commands db ["drop table if exists langs"]) => (0)
(jdbc/db-do-commands db ["drop table if exists releases"]) => (0)
:create => (0)
:create => (0)
:insert => ({:id 1} {:id 2})
(jdbc/query db ["select * from langs"]) =>
({:id 1, :lang "Clojure"} {:id 2, :lang "Java"})
clj-id => 1
:insert-rel => ({:id 1} {:id 2} {:id 3})
java-id => 2
:insert-rel => ({:id 4} {:id 5} {:id 6} {:id 7})
(jdbc/query db ["select langs.lang, releases.desc\n       from langs inner join releases\n       on (langs.id = releases.langId)\n       where lang = 'Clojure' "]) =>
({:lang "Clojure", :desc "ancients"}
 {:lang "Clojure", :desc "1.8"}
 {:lang "Clojure", :desc "1.9"})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49876504

复制
相关文章

相似问题

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