lua简单操作sqlite3,luasqlite3


转载地址:http://www.cnblogs.com/windtail/archive/2012/01/08/2623191.html

luasql模块支持sqlite3,可以完成最基本的数据库功能,不过官方文档上写得不是很详细。扫了下源代码,外加实验了下,得出了点经验。

环境

Windows XP,LuaForWindows

代码

  1. require"luasql.sqlite3"  
  2.   
  3. function enumSimpleTable(t)  
  4.   
  5.          print"-------------------"  
  6.   
  7.          fork,v in pairs(t) do  
  8.   
  9.                    print(k, " = ", v)  
  10.   
  11.          end  
  12.   
  13.          print"-------------------\n"  
  14.   
  15. end  
  16.   
  17. function rows(cur)  
  18.   
  19.          returnfunction(cur)  
  20.   
  21.                    localt = {}  
  22.   
  23.                    if(nil~= cur:fetch(t, 'a')) then return t  
  24.   
  25.                    elsereturn nil end  
  26.   
  27.          end,cur  
  28.   
  29. end  
  30.   
  31. env = assert(luasql.sqlite3())  
  32.   
  33. db =assert(env:connect("test.db"))  
  34.   
  35.    
  36. db:setautocommit(false)  
  37.   
  38. res = assert(db:execute [[CREATE TABLEpeople(name text, sex text)]])  
  39.   
  40. res = assert(db:execute [[INSERT INTOpeople VALUES('程序猿','男')]])  
  41.   
  42. res = assert(db:execute [[INSERT INTOpeople VALUES('程序猿老婆', '女')]])  
  43.   
  44. assert(db:commit())  
  45.   
  46.    
  47.   
  48. res = assert(db:execute [[SELECT * FROMpeople]])  
  49.   
  50. colnames = res:getcolnames()  
  51.   
  52. coltypes = res:getcoltypes()  
  53.   
  54. enumSimpleTable(colnames)  
  55.   
  56. enumSimpleTable(coltypes)  
  57.   
  58. for r in rows(res) do  
  59.     enumSimpleTable(r)  
  60. end  
  61.   
  62. res:close()  
  63.   
  64. db:close()  
  65.   
  66. env:close()  

结论

environment对象(数据库驱动)

构造

    env = luasql.sqlite3()

成员

    close()

        关闭环境。请先关闭所有connection对象。

connection对象(数据库连接)

构造

    con = env:connect(sqlite3_database_file_path)

  • env:环境
  • sqlite3_database_file_path:数据库路径字符串
  • con:数据库连接对象

成员

    res = execute(sql_statement)

        执行sql语句

  • sql_statement:要执行的sql语句,一般用[[sql]]的字符串形式,因为sql语句中常含有引号等特殊字符
  • res:
    • 对于不返回记录集的sql语句(如CREATE,DELETE),res是一个数字,表示操作影响了多少记录。
    • 对于返回记录集的sql语句(如SELECT),res是一个cursor对象(记录集)

    setautocommit(bAuto)

  • bAuto
    • 设置为true时,rollback当前事务,并忽略错误
    • 设置为false时,开始一个新的事务

    commit()

        提交事务

    rollback()

        回滚事务

    close()

        关闭数据库连接,请先关闭所有的cursor对象

    rowed = getlastautoid()

        获取最近一次自动生成的sqlite的rowid字段值(对应sqlite3_last_insert_rowid())

cursor对象

构造

    con:execute(select_sql_statement)

成员

    colnametable = getcolnames()

        以table形式返回记录集中每一列的列名

    coltypetable = getcoltypes()

        以table形式返回记录集中每一列的类型

    res = fetch([table[,modestring]])

        获取下一个记录集

  • table:如果指定了table,则会将数据复制到table中
  • modestring:可取值”n”或”a”,默认为”n”,
    • “n”:table中的key是数字
    • “a”:table中的key是字符串(列名)
  • res:如果未指定table,则返回记录,如果指定了table,则返回修改后的table;如果没有下一记录了,则返回nil

    close()

        关闭cursor对象
------------------------------------------------------------ 
本文由WindTaiL在cnblogs中发布,转载请注明出处

luasql模块支持sqlite3,可以完成最基本的数据库功能,不过官方文档上写得不是很详细。扫了下源代码,外加实验了下,得出了点经验。

环境

Windows XP,LuaForWindows

代码

  1. require"luasql.sqlite3"  
  2.   
  3. function enumSimpleTable(t)  
  4.   
  5.          print"-------------------"  
  6.   
  7.          fork,v in pairs(t) do  
  8.   
  9.                    print(k, " = ", v)  
  10.   
  11.          end  
  12.   
  13.          print"-------------------\n"  
  14.   
  15. end  
  16.   
  17. function rows(cur)  
  18.   
  19.          returnfunction(cur)  
  20.   
  21.                    localt = {}  
  22.   
  23.                    if(nil~= cur:fetch(t, 'a')) then return t  
  24.   
  25.                    elsereturn nil end  
  26.   
  27.          end,cur  
  28.   
  29. end  
  30.   
  31. env = assert(luasql.sqlite3())  
  32.   
  33. db =assert(env:connect("test.db"))  
  34.   
  35.    
  36. db:setautocommit(false)  
  37.   
  38. res = assert(db:execute [[CREATE TABLEpeople(name text, sex text)]])  
  39.   
  40. res = assert(db:execute [[INSERT INTOpeople VALUES('程序猿','男')]])  
  41.   
  42. res = assert(db:execute [[INSERT INTOpeople VALUES('程序猿老婆', '女')]])  
  43.   
  44. assert(db:commit())  
  45.   
  46.    
  47.   
  48. res = assert(db:execute [[SELECT * FROMpeople]])  
  49.   
  50. colnames = res:getcolnames()  
  51.   
  52. coltypes = res:getcoltypes()  
  53.   
  54. enumSimpleTable(colnames)  
  55.   
  56. enumSimpleTable(coltypes)  
  57.   
  58. for r in rows(res) do  
  59.     enumSimpleTable(r)  
  60. end  
  61.   
  62. res:close()  
  63.   
  64. db:close()  
  65.   
  66. env:close()  

结论

environment对象(数据库驱动)

构造

    env = luasql.sqlite3()

成员

    close()

        关闭环境。请先关闭所有connection对象。

connection对象(数据库连接)

构造

    con = env:connect(sqlite3_database_file_path)

  • env:环境
  • sqlite3_database_file_path:数据库路径字符串
  • con:数据库连接对象

成员

    res = execute(sql_statement)

        执行sql语句

  • sql_statement:要执行的sql语句,一般用[[sql]]的字符串形式,因为sql语句中常含有引号等特殊字符
  • res:
    • 对于不返回记录集的sql语句(如CREATE,DELETE),res是一个数字,表示操作影响了多少记录。
    • 对于返回记录集的sql语句(如SELECT),res是一个cursor对象(记录集)

    setautocommit(bAuto)

  • bAuto
    • 设置为true时,rollback当前事务,并忽略错误
    • 设置为false时,开始一个新的事务

    commit()

        提交事务

    rollback()

        回滚事务

    close()

        关闭数据库连接,请先关闭所有的cursor对象

    rowed = getlastautoid()

        获取最近一次自动生成的sqlite的rowid字段值(对应sqlite3_last_insert_rowid())

cursor对象

构造

    con:execute(select_sql_statement)

成员

    colnametable = getcolnames()

        以table形式返回记录集中每一列的列名

    coltypetable = getcoltypes()

        以table形式返回记录集中每一列的类型

    res = fetch([table[,modestring]])

        获取下一个记录集

  • table:如果指定了table,则会将数据复制到table中
  • modestring:可取值”n”或”a”,默认为”n”,
    • “n”:table中的key是数字
    • “a”:table中的key是字符串(列名)
  • res:如果未指定table,则返回记录,如果指定了table,则返回修改后的table;如果没有下一记录了,则返回nil

    close()

        关闭cursor对象
------------------------------------------------------------ 
本文由WindTaiL在cnblogs中发布,转载请注明出处

相关内容

    暂无相关文章