近期在找一个方便好用的serverless数据库,工作中有很多场景能用上,前一个项目用了SQLite发现不用给客户安装数据库真舒服。
应用场景特点主要包括:
- 安装量大
- 数据量小(10万左右的记录没啥影响?没仔细测试过)
- 读写频率不高
年前找到LiteDB这个项目(等过年特别闲),发现已经开源十几年了。C#上岗才学的,虽然也用了两年了,啥都不知道。 不过近期项目没用上,所以弄了个MakeDown浏览器(MDKM)用来帮自己熟悉LiteDB,顺便帮自己做个小工具,还挺好用(自卖自夸)。
写MD方面的html显示时参考了MarkDownMonster,还扒他一套的CSS文件(仅学习研究使用)。
LiteDB是一个全由C#开发,类似SQLite的单文件数据库,无需安装数据服务即可使用。
仅在C#上使用可以考虑替代SQLite。NuGet上就能获取。
下面大概总结一些使用的代码,使用基本没碰到什么坑没什么好写的,可能这就是我不知道LiteDB的原因吧。
创建或链接数据库文件
//链接字符串可以直接是文件地址,也可以和其它数据库一样以{key}={value};的结构组成链接语句,详细见LiteDB的维基
string connectionString = AppDomain.CurrentDomain.BaseDirectory + "Data.db";
using (LiteDB.LiteDatabase db = new LiteDB.LiteDatabase(connectionString))
{
//这里可以对db对象做任何操作
//...
//完成操作
db.Commit();
}
实体类型和增删改查
由于LiteDB就是C#开发的,所以它支持所有常用的C#基本类型或基本类型组成的类。
LiteDB采用CodeFirst方式。
//定义一个类型
public class MyEntity
{
//ObjectId是LiteDB定义的一个主键默认类型
//`_id`是默认主键的字段名称
//如果没有声明也会自动添加
//public ObjectId _id { get; set; }
public string Content { get; set; }
}
增删改查操作
//增删改查
using (LiteDB.LiteDatabase db = new LiteDB.LiteDatabase(connectionString))
{
//获取名为My_Entity集合没有就创建
//将集合内的元素限定为MyEntity类型来反序列化
var myCollection = db.GetCollection<MyEntity>("My_Entity");
//增
//插入成功会返回自动生成的_id
var insertId = myCollection.Insert(new MyEntity() { Content = "Hello world" });
//完成操作
db.Commit();
//查
var findResult = myCollection.FindById(insertId);
//改
findResult.Content += "!";
//实体类型没有声明`_id`字段,反序列化后的对象也会舍弃`_id`,在这里会报错找不到对应的记录来更新,因为`_id`字段为null
//myCollection.Update(findResult);
//实体类型没有声明`_id`字段但是已知`_id`的值还是可以操作
//myCollection.Update(insertId,findResult);
//根据条件更新
myCollection.UpdateMany($"{{Content:'{findResult.Content}'}}", LiteDB.Query.Contains("Content", "Hello"));
//完成操作
db.Commit();
//删
//根据`_id`来删除
myCollection.Delete(insertId);
//根据条件来删除
//删除内容包含Hello的所有记录
//myCollection.DeleteMany(LiteDB.Query.Contains("Content", "Hello"));
//完成操作
db.Commit();
}