2013-08-07 49 views
3

有沒有一種方法可以使用給定的FDML接口一次插入多條記錄?如何使用提供的clsql一次插入多條記錄FDML

給出的insert-record語句只能處理一個值的元組一次並調用這個函數無數次的思想,而不是一旦纏着我了不少,我猜(而實際上不必做任何分析),這也不是最快的方法。

+0

很久以前,我使用'clsql',但我相信你可以構造一個任意的查詢語句,如果預定義的類型不適合你的話......另一種可能性是插入臨時表的內容,如果你可以在生成表的過程中生成一些數據,那麼這有時是首選。 – 2013-08-07 19:46:03

+0

好吧,目前我只是構造了一個可以正常工作的字符串查詢,但我認爲如果有這樣一個很好的界面,爲什麼不嘗試使用它。對於這樣一個看似微不足道的問題,你的建議似乎有些複雜。但thx的建議。 – Sim

回答

2

這樣的事情呢?

; 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已經(或者更恰當地說沒有)列重命名的語法...所以你必須操縱字符串/擴展它來讓它使用符號。

+0

爲了擴展這個,你仍然必須編寫一個字符串生成函數來編寫相應的字符串查詢,因此你可以使用(clsql:query ...)。但我想這可能是唯一(當前)可用的解決方案,適合我的實際請求/問題 – Sim

+0

@Sim'clsql:query'爭論在'select'中缺少':from' ...也許你可以做類似'select從雙'或任何假表在你的數據庫管理系統中可用,但這聽起來是錯誤的... – 2013-08-10 16:56:06

+0

我的意思是你可以寫一個字符串生成方法女巫生成一個相應的SQL「INSERT INTO ...(...)VALUES (...)「語句,然後與'clsql:query'一起使用。如果你的意思是別的,請說明,因爲我當時不明白。 – Sim