假设您的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"})