Common lisp 如何使用clsql提供的FDML一次插入多个记录

Common lisp 如何使用clsql提供的FDML一次插入多个记录,common-lisp,clsql,Common Lisp,Clsql,有没有一种方法可以使用给定的FDML接口一次插入多个记录 给定的语句一次只能处理一个值元组,调用此函数的次数不可计数(而不是一次)的想法让我感到非常不安,我想在没有进行任何分析的情况下,这也不是最快的方法。类似的方法怎么样 ; SLIME 2013-04-02 CL-USER> (ql:quickload "clsql") To load "clsql": Load 1 ASDF system: uffi Install 1 Quicklisp release: c

有没有一种方法可以使用给定的FDML接口一次插入多个记录


给定的语句一次只能处理一个值元组,调用此函数的次数不可计数(而不是一次)的想法让我感到非常不安,我想在没有进行任何分析的情况下,这也不是最快的方法。

类似的方法怎么样

; SLIME 2013-04-02
CL-USER> (ql:quickload "clsql")
To load "clsql":
  Load 1 ASDF system:
    uffi
  Install 1 Quicklisp release:
    clsql
; Fetching #<URL "http://beta.quicklisp.org/archive/clsql/2013-04-20/clsql-20130420-git.tgz">
; 900.99KB
==================================================
922,610 bytes in 1.92 seconds (468.78KB/sec)
; Loading "clsql"
[package uffi]....................................
[package cmucl-compat]............................
[package clsql-sys]...............................
[package clsql]...................................
[package clsql-user]..............................
..................................................
[package ansi-loop]..............................
("clsql")
CL-USER> (ql:quickload "clsql-sqlite3")
To load "clsql-sqlite3":
  Load 1 ASDF system:
    clsql-sqlite3
; Loading "clsql-sqlite3"
[package clsql-uffi]..............................
[package clsql-sqlite3]...........................
[package sqlite3]........
("clsql-sqlite3")
CL-USER> (clsql:connect '("./test.db") :database-type :sqlite3)
#<CLSQL-SQLITE3:SQLITE3-DATABASE ./test.db OPEN {10080C08E3}>
CL-USER> (clsql:enable-sql-reader-syntax)
; No value
CL-USER> (clsql:create-table [test_insert]
                             '(([id] integer)
                               ([first_name] text)
                               ([last_name] text)))
; No value
CL-USER> (clsql:insert-records :into [test_insert]
                               :attributes '(id first_name last_name)
                               :values '(0 "John" "Neumann"))
; No value
CL-USER> (clsql:select [id] [first_name] [last_name] :from [test_insert])
((0 "John" "Neumann"))
("ID" "FIRST_NAME" "LAST_NAME")
CL-USER> (clsql:insert-records
           :into [test_insert]
           :attributes '(id first_name last_name)
           :query (clsql:sql-expression :string
           "select 1 as id, 'Albert' as first_name, 'Einstein' as last_name
            union select 2, 'Alan', 'Turing'"))
; No value
CL-USER> (clsql:select [id] [first_name] [last_name] :from [test_insert])
((0 "John" "Neumann") (1 "Albert" "Einstein") (2 "Alan" "Turing"))
("ID" "FIRST_NAME" "LAST_NAME")

也许可以用其他数据库提供不同语法的方式构造插入查询。clsql有或更确切地说没有用于列重命名的语法。。。因此,您必须操作字符串/扩展它,让它使用符号来代替。

我很久以前就使用了clsql,但我相信,如果预定义的查询之一不适合您,您可以构造任意查询。。。重新搜索的另一种可能性是插入临时表的内容,如果您可以在生成所述表的过程中生成一些数据,则有时会首选这种方法。目前,我只构建了一个运行良好的字符串查询,但我认为如果有这么好的接口,为什么不尝试使用它呢。对于这样一个看似微不足道的问题来说,你的建议似乎有点太复杂了。但是thx对于这个建议是正确的。为了扩展它,您仍然需要编写一个字符串生成函数来编写相应的字符串查询,因此您可以使用clsql:query。。。。但我想这可能是目前唯一适合我实际要求的解决方案/question@Simclsql:query在select中争论缺少:from。。。也许你可以做一些事情,比如从双表中选择,或者在你的DBMS中有任何虚假的表,但这听起来是错误的…我的意思是你可以写一个字符串生成方法,它生成一个对应的SQL插入到。。。价值观语句,然后与clsql:query一起使用。如果您是指其他内容,请指定,因为我当时不明白。@Sim是的,我的意思是您可以使用clsql:select。。。不是clsql:sql expression…,而是库希望您在查询的from子句中指定表,这可能是标准所要求的,但许多数据库允许您忽略它,如果您选择的是实际表以外的内容,例如,如果您只选择了一个数字或最后一个插入id等。