【问题标题】:Inserting multiple rows using mysql-otp driver for erlang with mysql:query使用 mysql-otp 驱动程序为带有 mysql:query 的 erlang 插入多行
【发布时间】:2018-06-26 13:09:21
【问题描述】:

我正在为 Erlang 使用 mysql-otp 驱动程序。它似乎工作正常,但没有关于使用它向表中插入多行的文档。

单行插入的简单用例:

ok = mysql:query(Pid, "INSERT INTO mytable (id, bar) VALUES (?, ?)", [1, 42]).

但是我需要插入多个值,我可以这样做吗?

  ok = mysql:query(Pid, "INSERT INTO mytable (id, bar) VALUES (?, ?)", [(1, 42),(2, 36), (3,12)]).

文档说明 Params = [term()],所以可能不是,这很糟糕。

【问题讨论】:

    标签: mysql erlang erlang-otp


    【解决方案1】:

    您当然可以在参数上组合使用 lists:foldl/3lists:join/2 来创建所需的查询格式:

    L = [[1, 42],[2, 36], [3,12]],
    PreparedList = lists:foldl(fun (Params, Inserts) -> Inserts ++ [io_lib:format("(~p,~p)", Params)]  end, [], L),
    %% Then you need to join these with a comma:
    Prepared = lists:flatten(lists:join(",", PreparedList)),
    %% this will result in "(1,42),(2,36),(3,12)"
    

    现在你只需要用这个Prepared变量调用mysql插入:

    ok = mysql:query(Pid, "INSERT INTO mytable (id, bar) VALUES ?", [Prepared]).
    %% The query will look like: "INSERT INTO mytable (id, bar) VALUES (1,42),(2,36),(3,12)"
    

    【讨论】:

    • 你试过了吗?认真的吗?
    • @Hynek-Pichi-Vychodil 是的,否则不会将其添加为可能的解决方案。这是怎么回事?
    • 或者像这样:PreparedList = [io_lib:format("(~p,~p)", XY) || XY
    【解决方案2】:

    我不认为这个驱动程序或mysql可以做这种事情。

    我认为你应该像下面那样做

     insert_mytable(Data)->
       {ok,Ref} = mysql:prepare(Pid,insert_mytable,"INSERT INTO mytable (id, bar) VALUES (?, ?)"),
       loop_insert(_Pid,Ref,Data).
     loop_insert(_Pid,_Ref,[])-> ok;
     loop_insert(Pid,Ref,[H|T])->
        ok = mysql:execute(Pid,Ref,H),
        loop_insert(Pid,Ref,T).
    

    【讨论】:

    • 这就是我现在正在做的事情,但是 MySQL 可以轻松地一次获取多个值。 INSERT INTO mytable (id, bar) VALUES (1, 2), (3, 4), (5, 6);完全没问题。
    • @RomanRabinovich 抱歉,我说的不是很清楚。我知道 MySQL 可以通过使用简单的 SQL 来执行“bacth insert”。我的意思是,当使用准备好的语句时,MySQL 似乎无法使用 "INSERT INTO mytable (id, bar) VALUES (?, ?)", [(1, 42),(2, 36), (3,12 )]"。我认为它可以与“INSERT INTO mytable (id, bar) VALUES (?, ?),(?,?),(?,?)...", [1, 42,2, 36 , 3,12...]".
    • 这个主意!
    猜你喜欢
    • 2019-05-10
    • 2016-09-12
    • 2020-11-17
    • 1970-01-01
    • 2012-10-11
    • 2011-01-17
    • 1970-01-01
    • 2011-07-13
    • 2021-05-01
    相关资源
    最近更新 更多