D语言操作Sqlite数据库简单教程
一
D语言数据库封装-Sqlite的安装设置
1.1 首先下载 DWin 库 0.37 (在写作本文时还未正式发布)
http://dwin.d-programming-language-china.org/
1.2 把 ...\dwin\lib 路径加入到dmd\bin\sc.ini 的LIB搜索路径,注意要使用你的实际路径。
1.3 下载最好的
D语言编辑器 SciTE4D (当然可以用其他自己喜欢的编辑器)
http://scite4d.d-programming-language-china.org/
1.4 中文处理要注意的是sqlite默认以utf-8编码存储.
1.5 另外要注意sqlite仅支持文件锁,换句话说,它对并发的处理并不好,不推荐在网络环境使用,适合单机环境.
二 创建数据库/打开数据库
Sqlite使用文件作为数据库,你可以指定数据库文件的位置。
复制内容到剪贴板
代码:
import dwin.database.sqlite.All;
auto con = new Connection(r"D:\test.db");使用sqlite的Connection可以创建一个数据库文件,上面我指明了路径。当数据库文件不存在的时候,它会自动创建。如果已经存在这个文件,则打开这个文件。con为数据库连接对象。
三 操作数据库的基本对象
3.1 数据库连接对象
象前面的con就是一个数据库的连接对象,它可以有以下操作:
* commit()--事务提交
* rollback()--事务回滚
* close()--关闭一个数据库连接
* createCursor()--创建一个游标
3.2 游标对象
所有sql语句的执行都要在游标对象下进行。
复制内容到剪贴板
代码:
auto cur = con.createCursor() 这样定义了一个游标。游标对象有以下的操作:
* execute()--执行sql语句
* vaExecute--执行多条sql语句
* close()--关闭游标
* fetchOne()--从结果中取一条记录
* fetchRows()--从结果中取多条记录
* fetchAll()--从结果中取出多条记录
...
关于对象的方法可以去 查看D语言库DWin相应模块的源代码。不过我不是都使用过。
四、D语言操作数据库 Sqlite 使用举例
4.1 建库
前面已经有了,不再重复。
4.2 建表
复制内容到剪贴板
代码:
auto cur = con.createCursor()
cur.execute("create table catalog (
id INT64 primary key,
pid INT64,
name TEXT UNIQUE
)"); 上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的。
关于sqlite支持的数据类型,在它主页上面的文档中有描述,可以参考:Version 2 DataTypes
http://www.sqlite.org/datatypes.html
4.3 insert(插入)
复制内容到剪贴板
代码:
cur.execute("create table catalog (id INT primary key, pid INT, name TEXT);"c);
cur.execute("insert into catalog values (0, 0, 'name1');"c);
cur.execute("insert into catalog (id, pid, name) values (1, 0, 'hello');"c);
con.commit();如果你愿意,你可以一直使用cur游标对象。注意,对数据的修改必须要使用事务语句:commit()或rollback(),且对象是数据库连接对象,这里为con。
4.4 select(选择)
复制内容到剪贴板
代码:
cur.execute("select * from catalog;");
static int[] ts1 = [
SQLiteDataType.INT,
SQLiteDataType.INT,
SQLiteDataType.TEXT];
auto datas = cur.fetchAll(ts1);
foreach(data; datas)
{
Stdout.formatln( "id {}, pid {}, name {}",
data[0].unpack!(int)(),
data[1].unpack!(int)(),
data[2].unpack!(char[])() );
}fetchAll ()返回结果集中的全部数据,注意,游标是有状态的,它可以记录当前已经取到结果的第几个记录了,因此,一般你只可以遍历结果集一次。在上面的情况下,如果执行fetchOne()会返回null。这一点在测试时需要注意。
复制内容到剪贴板
代码:
cur.execute("select * from catalog where id = 1");
auto data = cur.fetchOne(ts1);
Stdout.formatln( "id {}, pid {}, name {}",
data[0].unpack!(int)(),
data[1].unpack!(int)(),
data[2].unpack!(char[])() );
4.5 update(修改)
复制内容到剪贴板
代码:
cur.execute("update catalog set name='name2' where id = 1");
cur.execute("select * from catalog");
auto data = cur.fetchOne(ts1);
Stdout.formatln( "id {}, pid {}, name {}",
data[0].unpack!(int)(),
data[1].unpack!(int)(),
data[2].unpack!(char[])() ); 4.6 delete(删除)
复制内容到剪贴板
代码:
cur.execute("delete from catalog where id = 1;");
cur.execute("select * from catalog;");
datas = cur.fetchAll(ts1);
foreach(data; datas)
{
Stdout.formatln( "id {}, pid {}, name {}",
data[0].unpack!(int)(),
data[1].unpack!(int)(),
data[2].unpack!(char[])() );
} 4.7 完整示例代码
打开D语言编辑器 SciTE4D (
http://scite4d.d-programming-language-china.org/ ), 新建文档,保存为test.d, 然后按Ctrl + F5 运行代码。
复制内容到剪贴板
代码:
import tango.io.Stdout;
import tango.io.FilePath;
import dwin.database.sqlite.All;
pragma(lib, "dwin-debug.lib");
void main()
{
char[] path = r"D:\test.db";
FilePath fp = FilePath(path); // cause VM exception if exists
if(fp.exists) fp.remove;
auto con = new Connection();
con.open(path);
auto cur = con.createCursor();
scope(exit)
{
cur.close;
con.close;
}
cur.execute("create table catalog (id INT, pid INT, name TEXT);"c);
cur.execute("insert into catalog (id, pid, name) values (1, 0, 'name1');"c);
cur.execute("insert into catalog (id, pid, name) values (0, 1, 'hello');"c);
cur.execute("select * from catalog;");
static int[] ts1 = [
SQLiteDataType.INT,
SQLiteDataType.INT,
SQLiteDataType.TEXT];
Stdout("fetchAll:").newline;
auto datas = cur.fetchAll(ts1);
foreach(data; datas)
{
Stdout.formatln( "id {}, pid {}, name {}",
data[0].unpack!(int)(),
data[1].unpack!(int)(),
data[2].unpack!(char[])() );
}
Stdout("fetchOne:").newline;
cur.execute("select * from catalog where id = 1;");
auto da = cur.fetchOne(ts1);
Stdout.formatln( "id {}, pid {}, name {}",
da[0].unpack!(int)(),
da[1].unpack!(int)(),
da[2].unpack!(char[])() );
Stdout("update:").newline;
cur.execute("update catalog set name='name2' where id = 1;");
cur.execute("select * from catalog;");
da = cur.fetchOne(ts1);
Stdout.formatln( "id {}, pid {}, name {}",
da[0].unpack!(int)(),
da[1].unpack!(int)(),
da[2].unpack!(char[])() );
Stdout("delete:").newline;
cur.execute("delete from catalog where id = 1;");
cur.execute("select * from catalog;");
datas = cur.fetchAll(ts1);
foreach(data; datas)
{
Stdout.formatln( "id {}, pid {}, name {}",
data[0].unpack!(int)(),
data[1].unpack!(int)(),
data[2].unpack!(char[])() );
}
}以上是关于如何使用D语言库DWin来操作Sqlite的简单示例。
20080426 首发 D语言论坛
http://bbs.d-programming-language-china.org/