Clojure从表中选择记录并将这些记录插入另一个表中

时间:2018-01-15 21:27:06

标签: sql postgresql clojure

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

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

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

2 个答案:

答案 0 :(得分: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稍后使用first结果假设employee_id是唯一的,因此my-employee将是单个地图(如果找不到则为零) ):

(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获取员工的功能,将员工行/地图转换为其他 employees_too表模式的功能,以及插入行的功能/映射到该表。你可以像这样将它们绑在一起:

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

答案 1 :(得分:-1)