Lua 自身并没有提供访问数据库的函数,但是借助外部扩展库我们可以很容易实现对数据库的各种操作,下面就为大家介绍这样一个扩展库 - LuaSQL,你可以在下载区得到它。

  LuaSQL 定义了一套简单的面向对象的 API,通过它,Lua 可以以统一的方法访问各种流行的数据库(例如 PostgreSQL,ODBC,JDBC,MySQL,SQLite,Oracle 和 ADO 等等)。

  LuaSQL 在 Lua 中定义了一个名称为 luasql 的全局表(用初始化函数 luaopen_luasqldrivername 生成),这个表储存了载入数据库驱动的初始化方法。这些方法可以创建一个环境对象,这些环境对象则可以创建数据库的连接对象。连接对象可以执行各种 SQL 语句,最终产生游标对象。

环境对象

  环境对象是由储存在 luasql 表中的各种数据库初始化函数创建的,这些函数的名称和它们对应的数据库名称是一样的。例如:

env = luasql.odbc()
  这会使用 ODBC 驱动创建一个环境对象。JDBC 驱动比较特殊,你还必须让它知道应该使用哪种内部驱动器,因此在创建环境对象时,你应该把驱动的类名作为参数传递给 luasql.jdbc  函数。例如:

env = luasql.jdbc("com.mysql.jdbc.Driver")

方法

env:close()
  关闭环境对象。必须在与它相关的所有数据库连接都关闭以后才应该调用这个函数。
  返回值:关闭成功返回 true,关闭失败或者环境对象已经被关闭了返回 false。

env:connect(sourcename[,username[,password]])
  用指定的用户名(username)和密码(password)连接到数据源(sourcename)。
  sourcename 根据数据库驱动的不同而改变。有些只使用一个简单的数据库名称即可,例如 MySQL, PostgreSQL 和 SQLite;ODBC 驱动需要一个 DSN 名称;Oracle 驱动需要一个服务名称;JDBC 驱动则需要一个字符串,就像“jdbc:<database system>://<database name>”一样。
  另见: PostgreSQL 扩展 和 MySQL 扩展。
  返回值:一个连接对象。

连接对象

  连接对象包含数据源连接的特殊属性,它是由 environment:connect 创建的。

方法

conn:close()
  关闭数据库连接。只有在所有的游标都关闭的情况下才有可能成功关闭连接。
  返回值:关闭成功返回 true,关闭失败或者连接已经关闭了返回 false。

conn:commit()
  提交当前事务处理。此方法在不支持事务处理的数据库上不会正常工作。   返回值:提交成功返回 true,提交失败或者数据库不支持事务处理则返回 false。

conn:execute(statement) 
  执行给定的 SQL 语句
  返回值:一个游标对象,或者一个数字,指示有多少条记录受此语句的影响。

conn:rollback()
  回滚当前事务处理。此方法在不支持事务处理的数据库上不会正常工作。   返回值:回滚成功返回 true,回滚失败或者数据库不支持事务处理则返回 false。

conn:setautocommit(boolean) 
  打开或者关闭“自动提交事务处理”功能。这个方法在不支持事务处理的数据库上不会正常工作。在支持事务处理单不支持自动提交事务处理的数据库上,会根据数据库驱动的不同而有不同的结果。
  返回值:设置成功返回 true,设置失败或者数据库不支持事务处理则返回 false。

游标对象

  游标对象包含从 SQL 语句执行结果提取数据的各种方法。它是由 connection:execute 创建的。

方法  

cur:close()
  关闭游标对象。
  返回值:关闭成功返回 true,关闭失败或者游标对象已经关闭了返回 false。

cur:fetch([table[,modestring]])
  获取 SQL 语句执行结果中的下一条记录结果。
  如果调用此方法时没有传递任何参数,结果会直接返回给方法的调用者。如果传递了 table 参数,结果会被复制到一个表(Lua 概念中的表)中并被返回。同时,你还可以指定一个 mode 参数,指示返回的表的所以方式。它有以下两个值:

"n" 
  结果表以数字为索引标识符(默认)

"a" 
  结果以字母为索引标识符

  数字索引标识符的位置由执行的 SQL 语句中 select 后面的字段顺序决定的;字母索引标识符则是根据字段的名称来定的。
  可选的 table 参数是用来储存下一条记录的。
  此方法不保证返回结果的类型,这要由你所使用的数据库驱动确定。目前来说,PostgreSQL 和 MySQL 驱动会把所有的结果都转换为字符串,而 ODBC 和 Oracle 驱动则会根据字段类型返回对应的 Lua 类型的值
  返回值:如上所述的数据结果,或者在没有任何记录结果时返回 nil。注意这并不是唯一返回 nil 的情况,当获取的结果有效时也可能返回 nil。

cur:getcolnames()
  返回值: 一个由字段名称组成的表。

cur:getcoltypes() 
  返回值:一个由字段类型组成的表。

PostgreSQL 扩展

  除了上面所说的通用的方法特性外,PostgreSQL 驱动还额外提供以下特性:

env:connect(sourcename[,username[,password[,hostname[,port]]]])
  PostgreSQL 驱动的这个方法还提供了另外两个可选的参数,指明了连接的主机名和端口号。当然,你也可以只用地一个参数就可以包含所有的连接信息,就像 PostgreSQL 手册中 PQconnectdb 函数的参数一样(例如,environment:connect("dbname=<name> user=<username>"))
  另见:环境对象。
  返回值:一个连接对象。

cur:numrows()
  另见:游标对象
  返回值:SQL  查询结果的纪录条数。

MySQL 扩展

  除了上面所说的通用的方法特性外,MySQL 驱动还额外提供以下特性:

env:connect(sourcename[,username[,password[,hostname[,port]]]])
  MySQL 驱动的这个方法还提供了另外两个可选的参数,指明了连接的主机名和端口号。
  另见:环境对象。
  返回值:一个连接对象。

Oracle 扩展

  除了上面所说的通用的方法特性外,Oracle 驱动还额外提供以下特性:

cur:numrows()
  另见:游标对象
  返回值:SQL  查询结果的纪录条数。


下面是用 Lua 访问 Access 的一个简单例子

-- 载入 ODBC 外部扩展库
assert (loadlib ("odbc.dll", "luaopen_luasqlodbc")) ()

-- 创建环境对象
env = assert (luasql.odbc())

-- 连接数据库
con = assert (env:connect ("luatest",     -- DSN 名称
                           "username",        -- 用户名
                           "password"))  -- 密码

-- 删除数据库中的 players 数据表
assert (con:execute"DROP TABLE players")

-- 创建 players 数据表
assert (con:execute[[
  CREATE TABLE players(
    name  varchar(50),
    class varchar(50)
  )
]])

-- 添加一些记录
list = {
  {name="Nick Gammon", class="mage",},
  {name="David Haley", class="warrior",},
  {name="Shadowfyr", class="priest",}
}

for i, p in pairs (list) do
  assert (con:execute(string.format([[
    INSERT INTO players
    VALUES ('%s', '%s')]], p.name, p.class)
  ))
end  -- for loop

-- 执行一个查询语句, 返回游标对象
cur = assert (con:execute ("SELECT * from players" ))

-- 打印结果中的所有记录
row = cur:fetch ({}, "a")

while row do
  print ("\n------ 新纪录 ---------\n")
  table.foreach (row, print)
  
  -- 重复使用这个表, 以节省资源
  row = cur:fetch (row, "a")
end  -- while loop

-- 关闭和数据库有关的所有对象
cur:close()
con:close()
env:close()

 

以下是用Lua操作mysql数据库的过程

require "luasql.mysql"

--创建环境对象
env = luasql.mysql()

--连接数据库
conn = env:connect("数据库名","用户名","密码","IP地址",端口)

--设置数据库的编码格式
conn:execute"SET NAMES GB2312"

--执行数据库操作
cur = conn:execute("select * from role")

row = cur:fetch({},"a")

--文件对象的创建
file = io.open("role.dat","w+");

while row do
    var = string.format("%d %s\n", row.id, row.name)

print(var)

file:write(var)

row = cur:fetch(row,"a")
end

file:close()  --关闭文件对象
conn:close()  --关闭数据库连接
env:close()   --关闭数据库环境

让 Lua 访问数据库的更多相关文章

  1. C#使用ADO.NET访问数据库(一)

    博主好久没更新博客了,最近有点忙(打麻将0.0..),今天更新一篇C#的,我还是想坚持更新博客,分享一下自己的心得,闲话少说,开始正题~~ ADO.NET概述:ADO.NET的作用在于他是客户端访问服 ...

  2. Android 异步任务,通过PHP访问数据库,多线程,线程间通讯

    文章列表MainActivity.java package com.eric.asynctask; import java.io.IOException; import java.util.Array ...

  3. ADO.NET 访问数据库

    对数据库的访问时各种数据库应用程序开发的核心技术,.NET框架中提出的ADO.NET技术为应用程序的开发提供了一致的接口,增强了程序的可移植性和可扩展性. a:使用链接对象Connection连接数据 ...

  4. 如何通过JDBC访问数据库

    Java数据库连接(JDBC)用与在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口,java.sql包中包含了JDBC操作数据库 ...

  5. (转)发布Silverlight+WCF程序到IIS后,客户端访问数据库失败的解决方案

    转自url:http://greatverve.cnblogs.com/archive/2011/11/30/silverlight-wcf-pub.html 我们在编写Silverlight程序时, ...

  6. 在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  7. Entity FrameWork 中使用Lambda访问数据库性能优化

    在使用Entity Framework 访问数据库时,我们经常使用Lambda表达式,但是如果不小心的话,很容易就掉到坑里了.比如下面的例子:用Lambda访问MSSqlServer中的NewsInf ...

  8. sqlserver 服务器主体 无法在当前安全上下文下访问数据库

    今天使用sqlserver,发现了一个问题,就是使用 insert into 数据库名.dbo.表名(字段) values(值) 这样语句的时候,会返回错误: sqlserver 服务器主体 无法在当 ...

  9. C++实现对lua访问的封装

    这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数. 本来我想引进luabind,但luabind相对又过于复杂,并不是所 ...

随机推荐

  1. Linux运维的第二周总结

    挂载操作:mount 设备文件信息 挂载点目录:mount /dev/cdrom/mnt ; Umount /mnt 查看日志文件:日志文件保存路径: /var/log      /日志重要文件信息: ...

  2. Java学习笔记1(基础)

    计算机语言和Java 计算机语言主要由一些指令(包括数字.符号和语法等)组成,可以分为机器语言.汇编语言.高级语言三大类.Java是一种高级计算机语言,是一种可以编写跨平台应用软件.完全面向对象的程序 ...

  3. 洛谷 P2342 叠积木 题解

    本蒟蒻又来发题解了 这题是不是有点像并查集,但是那个询问的个数是不是有点骚: 所以,普通的并查集是无法解决这个问题的,这个时候就需要用到带权并查集了: 每次跑的时候都记录下它的下面有几个点,然后询问的 ...

  4. JWT攻击手册:如何入侵你的Token

    JSON Web Token(JWT)对于渗透测试人员而言,可能是一个非常吸引人的攻击途径.因为它不仅可以让你伪造任意用户获得无限的访问权限,而且还可能进一步发现更多的安全漏洞,如信息泄露,越权访问, ...

  5. Java修炼——Set的子接口Vector的方法使用

    Vector的方法和ArrayList相似 package com.bjsxt.Array; import java.util.Iterator; import java.util.List; imp ...

  6. SpringBean生命周期及作用域

    bean作用域 在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象.在BeanDefinition对象中有scope 属性,就是 ...

  7. HDU1846 Brave Game(巴什博弈)

    十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫<勇敢者的游戏>(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻. 今天,大家选择 ...

  8. 2018 ACM/ICPC 南京 I题 Magic Potion

    题解:最大流板题:增加两个源点,一个汇点.第一个源点到第二个源点连边,权为K,然后第一个源点再连其他点(英雄点)边权各为1,然后英雄和怪物之间按照所给连边(边权为1). 每个怪物连终点,边权为1: 参 ...

  9. Hybrid App 应用开发中 9 个必备知识点复习(WebView / 调试 等)

    前言 我们大前端团队内部 ?每周一练 的知识复习计划继续加油,本篇文章是 <Hybrid APP 混合应用专题> 主题的第二期和第三期的合集. 这一期共整理了 10 个问题,和相应的参考答 ...

  10. 大数据学习笔记——Linux完整部署篇(实操部分)

    Linux环境搭建完整操作流程(包含mysql的安装步骤) 从现在开始,就正式进入到大数据学习的前置工作了,即Linux的学习以及安装,作为运行大数据框架的基础环境,Linux操作系统的重要性自然不言 ...