【问题标题】:Clojure Selecting records from a table and inserting those records into another tableClojure 从表中选择记录并将这些记录插入到另一个表中
【发布时间】:2018-01-15 21:27:06
【问题描述】:

我正在尝试将来自不同数据库的数据插入到一个数据库中。我有选择查询工作,但我无法获取选择查询并将其插入到不同的数据库和/或表中。

(jdbc/query db ["select * from employees
                    where employee_id = 1927"]
                {:as-arrays? true})

现在,我现在如何将上述数据动态插入到另一个表中?

【问题讨论】:

标签: sql postgresql clojure


【解决方案1】:

假设您的employees 表如下所示:

create table employees (
    employee_id integer,
    name        text,
    primary key (employee_id)
);
insert into employees (employee_id, name) values (123, 'taylor');

我不会使用:as-arrays? true 进行查询,因为行映射query 返回默认情况下更容易使用。

(jdbc/query db ["select * from employees where employee_id = ?" 123])
;; notice query parameterization; important! ----------------^  ^
=> ({:employee_id 123, :name "taylor"})

我们可以def 以供以后使用,假设employee_id 是唯一的,则取first 结果,因此my-employee 将是单个映射(如果未找到,则为nil):

(def my-employee
  (first (jdbc/query db ["select * from employees where employee_id = ?" 123]))

现在让我们假设您要插入的另一个表如下所示:

create table employees_too (
    employee_id integer,
    name        text,
    phone       text, -- just a new column
    primary key (employee_id)
);

然后您可以像这样插入该员工行:

(db/insert! conn "employees_too"
            (assoc my-employee
                   :phone (str (rand-int 9999999999))))
=> ({:employee_id 123, :name "taylor", :phone "250505207"})

并且返回插入的行映射(至少在使用 PostgreSQL 时)。

您可能希望为这些操作创建可重用的函数:

(defn get-employee [id]
  (first (db/query conn ["select * from employees where employee_id = ?" id])))
(defn employee->employee-too [employee]
  (assoc employee :phone (str (rand-int 99999))))
(defn insert-employee-too [employee-too]
  (db/insert! conn "employees_too" employee-too))

通过 ID 获取员工的函数,将员工行/映射转换为 other employees_too 表架构的函数,以及将行/映射插入该表的函数。您可以像这样将它们捆绑在一起:

(-> (get-employee 123)
    (employee->employee-too)
    (insert-employee-too))
=> ({:employee_id 123, :name "taylor", :phone "8147"})

【讨论】:

  • (-> 123 get-employee employee->employee-too insert-employee-too)
【解决方案2】:
猜你喜欢
  • 2012-01-23
  • 2011-10-23
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多