【问题标题】:How to insert multiple records at once using the clsql provided FDML如何使用 clsql 提供的 FDML 一次插入多条记录
【发布时间】:2013-08-07 14:23:12
【问题描述】:

有没有办法使用给定的 FDML 接口一次插入多条记录?

给定的insert-record 语句一次只能处理一个值元组,并且调用这个函数无数次而不是一次的想法让我很烦,我猜(实际上没有进行任何分析)这也不是最快的方法。

【问题讨论】:

  • 很久以前我用过clsql,但我相信你可以构造一个任意的查询,如果预定义的品种对你不起作用......另一种可能性重新搜索是插入一个临时表的内容,这有时可能是首选,例如,如果您可以在生成所述表期间生成一些数据。
  • 好吧,目前我只是构建了一个可以正常工作的字符串查询,但我想如果有这么好的界面,为什么不尝试使用它。对于这样一个看似微不足道的问题,您的建议似乎有点过于复杂。但是谢谢你的建议。

标签: common-lisp clsql


【解决方案1】:

这样的事情怎么样?

; 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:query ...)。但我想这可能是适合我实际请求/问题的唯一(当前)可用解决方案
  • @Sim clsql:query 争论在select 中缺少:from...也许您可以执行select from dual 之类的操作或您的DBMS 中可用的任何假表,但这听起来是错误的...
  • 我的意思是你可以写一个字符串生成方法来生成相应的 SQL "INSERT INTO ... (...) VALUES (...)" 语句然后与@987654327一起使用@。如果你的意思是别的,请说明,因为我当时不明白。
  • @Sim 是的,我的意思是你可以使用(clsql:select ...) 而不是(clsql:sql-expression ...),但是库希望你在查询的from 子句中指定表,这可能需要标准,但许多数据库允许您省略它,如果您选择的不是实际表,例如,如果您只选择一个数字或最后插入 id 等。
猜你喜欢
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多