【问题标题】:Insert data in database (Mysql) from Lua table从 Lua 表向数据库(Mysql)中插入数据
【发布时间】:2014-12-15 09:04:26
【问题描述】:

我正在尝试在 mysql 数据库中提供一个表,其中包含 1 000 000 行。 我正在使用 Lua 和函数:

conn:execute("INSERT INTO orders (dates, ordertype) VALUES ('"..tab[1][dateIndex]......

对于每一行。 问题是它很长,我真的需要更高的效率。 你有其他解决方案吗(也许创建一个 .csv 并用 mysql 加载它,也许有一个函数可以更有效地在数据库中加载矩阵,......)。使用 Lua 是一项义务,因为我正在使用现有项目。

感谢您的帮助

【问题讨论】:

    标签: mysql insert lua bigdata lua-table


    【解决方案1】:

    首先,您可以在每次插入时停止提交。

    您也可以使用准备好的查询。它由 Lua-DBI 和 Lua-ODBC 提供 我使用 ODBC。

    local env = odbc.environment()
    lcoal db = env:driverconnect{
      Driver = IS_WINDOWS and '{MySQL ODBC 5.2 ANSI Driver}' or 'MySQL';
      db='test';
      uid='root';
    };
    
    cnn:set_autocommit(false)
    local stmt = db:prepare("INSERT INTO orders (dates, ordertype) VALUES(?,?)")
    for i, row in ipairs(tab) do
      stmt:bindstr(row[dateIndex])
      ...
      stmt:execute()
      if i % 1000 == 0 then
        cnn:commit()
      end
    end
    

    ODBC 还提供变量。可能会更快,因为它们不会每次都调用 SQLBindParam。

       -- create stmt as preview
       ...
       local dateValue = odbc.date():bind_param(stmt, 1)
       local orderValue = odbc.ulong():bind_param(stmt, 2) 
    
        for i, row in ipairs(tab) do
          dateValue:set(row[1]) -- data is yyyy-mm-dd e.g. 2014-10-14
          orderValue:set(row[2])
          stmt:execute()
          ...
          -- same as preview
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2021-02-19
      • 2014-02-01
      相关资源
      最近更新 更多