【问题标题】: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