database_zh
基础配置
当你需要使用数据库增删改查功能时,可直接使用CORE_DB(/std/database.c),这个文件提供了一系 列的方法链式操作数据库。
void test()
{
/**
* @brief 初始化数据库连接
*
*/
object DB = new(CORE_DB, host, db, user);
// ...
}
或者使用 setConnection() 方法配置数据库:
void test()
{
object DB = new(CORE_DB);
mapping db = ([
"host":"127.0.0.1",
"database":"mud",
"user":"root",
]);
DB->setConnection(db);
}
上以配置使用以的是系统默认数据库类型__DEFAULT_DB__,如果要指定数据库类型可以使用以下方式:
void test()
{
// 初始化时指定type
object DB = new(CORE_DB, host, db, user, type);
// 通过配置指定type(使用SQLITE3)
mapping db = ([
"host":"",
"database":"/data/mudlite.db",
"user":"",
"type":__USE_SQLITE3__
]);
DB->setConnection(db);
}
数据库类型可以使用宏定义:__USE_MYSQL__、__USE_SQLITE3__、__USE_POSTGRE__或__DEFAULT_DB__。
查询
从数据表中查询所有行
使用DB对象的table方法指定要查询的数据表并返回一个查询对象,使用get方法获取所有结果,返回值为结果二维数组,示例代码:
inherit CORE_DB;
void test()
{
mixed res;
// 获取 users 表的所有结果
res = DB->table("users")->get();
printf("%O\n", res);
}
从数据表中获取单行或单列
使用first方法可以获取查询结果的第一行,返回值为一维数组结果,如果指定数组做为参数,只查询指定的列,另外你可以使用where方法限制查询条件,核心代码:
// 查询用户表中的第一条数据
res = DB->table("users")->first();
// 查询用户表中的第一条数据的name和email
res = DB->table("users")->first("name", "email");
// 查询用户表中用户名为 ivy 的数据
res = DB->table("users")->where("name", "ivy")->first();
如果不需要整行数据,则可以使用value方法从记录中获取单个值。该方法将直接返回该字段的值:
// 获得用户 ivy 的 email
email = DB->table("users")->where("name", "ivy")->value("email");
// 获取随机用户的 email
email = DB->table("users")->inRandomOrder()->value("email");
如果是通过 id 字段值获取一行数据,可以使用 find 方法:
// 获取 ID 为 1 的用户数据
res = DB->table("users")->find(1);
获取一列的值
如果你想获取单列数据的集合,则可以使用 pluck 方法。在下面的例子中,我们将获取角色表中所有邮箱:
// 返回所有用户的邮箱数组
res = DB->table("users")->pluck("email");
聚合
查询构造器还提供了各种聚合方法,比如 count,max,min,avg,还有 sum。你可以在构造查询后调用任何方法:
// 获取用户总数
users = DB->table("users")->count();
// 获取等级最高的用户
level = DB->table("users")->max("level");
同样,你可以通过条件查询限制聚合查询:
// 返回ID为9的用户发贴的访问量之和
res = DB->table("topics")->where("user_id", 9)->sum("view_count");
// 判断用户mudren是否存在
count = DB->table("users")->where("name", "mudren")->count();