基础功能
SF 目前只支持Mysql数据库,提供mysqli和pdo_mysql两种适配方式。
配置
配置文件application/configs/application.ini 添加数据库配置:
;数据库适配器 mysqli或pdo_mysql
resources.db.adapter = pdo_mysql
;数据库表明前缀
resources.db.prefix =
resources.db.params.host = loclhost
resources.db.params.dbname = dbname
resources.db.params.username = user
resources.db.params.password = password
一般来说,db model是一个数据库的访问入口,Star_Model_Abstract继承,更特殊的是,它是某个特定数据库表会的访问入口。每个model使用数据表,例如,Usermodel使用'user'表。下面是一个简单的User model在SF中的demo:
<?php
class UserModel extends Star_Model_Abstract
{
protected $_name = "users";
protected $_primary = "user_id";
}
?>
提示:1.实例化model并不会开始链接数据库,只有执行SQL语句才会开始链接数据库,使用缓存不增数据库压力。2.每张表必须包含自增主键,不然会造成model操作失败,养成一种良好的习惯。
操作
insert
- data //插入数据
返回last_insert_id
//返回last_insert_id
$this->insert(array(
"username" => "john",
"age"; => 25,
));
update
- where //更新条件
- data //更新数据
- quote_indentifier //是否给data数据添加添加引号处理 默认true
返回影响行数
//直接传数字表示主键值,等于更新user_id=1
$this->update(1, array("age" => 26));
$this->update("username" => "john", array("age" => 27));
//表示给user_id=1的用户年龄加1
$this->update(1, array("age" => "age + 1"), false);
delete
- where //删除条件
返回影响行数
//直接传数字表示主键值,等于删除user_id=1的数据
$this->delete(1);
//删除用户名等于john的数据
$this->delete("username" => "john");
query
- sql //sql语句
查询返回结果集,操作返回影响行数
查询
getPk
- pk_id //主键ID
返回主键信息
//执行SQL:SELECT * FROM `users` WHERE (user_id = 1) limit 1; 返回user_id=1的用户信息
$this->getPk(1);
fetchAll
- where //查询条件
- conditions //查询字段 默认 *,返回所有字段
- order //排序 默认 null, null表示没有排序
- page //当前页数 默认null, null表示没有限制
- page_size //限制多少数据 默认null, null表示没有限制
返回结果集列表
//执行SQL:SELECT * FROM `users` WHERE (age > 18) ORDER BY age ASC LIMIT 20 OFFSET 0,返回前面20条年龄大于18的所有用户列表,按照年龄升序排序
$this->fetchAll("age > 18", "*", "age ASC", 1, 20);
//执行SQL: SELECT user_id, age FROM `users` WHERE (age > 18) ORDER BY age ASC, 返回年龄大于18的所有用户列表,按照年龄升序排序
$this->fetchAll("age> 18", array("user_id", "age"), "age ASC");
//执行SQL:SELECT user_id as id, age FROM `users` WHERE (age > 18) ORDER BY age ASC,返回年龄大于18的所有用户列表,按照年龄升序排序
$this->fetchAll("age > 18" array("id" => "user_id", "age"), "age ASC");
//执行SQL: SELECt * FROM `users` WHERE (age > 18) ORDER BY age ASC, user_id ASC,返回年龄大于18的所有用户列表,按照年龄和user_id升序排序
$this->fetchAll("age > 18", "*", array("age ASC", "user_id ASC"));
fetchRow
- where //查询条件
- conditions //查询字段 默认 * 返回所有字段
- order //排序 默认 null, null表示没有排序
返回第一行结果集数据
//执行SQL:SELECT * FROM `users` WHERE (user_id = 1) LIMIT 1,返回user_id = 1的用户信息
$this->fetchRow("user_id = 1");
fetchOne
- where //查询条件
- conditions //查询字段 默认 * 返回所有字段
- order //排序 默认 null, null表示没有排序
只返回第一个字段值
//执行SQL:SELECT count(1) FROM `users` WHERE (age > 18); 返回年龄大于18的用户数
$this->fetchOne("age > 18", "count(1)");
fetchCol
- where //查询条件
- conditions //查询字段 默认 *,返回所有字段
- order //排序 默认 null, null表示没有排序
- page //当前页数 默认null, null表示没有限制
- page_size //限制多少数据 默认null, null表示没有限制
返回所有结果集的第一个字段列表
//执行SQL: SELECT user_id FROM `users` WHERE (age > 18); 返回所有年龄大于18用户的user_id
$this->fetchCol("age > 18", "user_id");
事务
当你需要顺序执行多个相关的的query
时,你可以把他们封装到一个事务中去保护数据一致性。SF提供了一个简单的接口来实现事务操作。 如下执行 SQL 事务查询语句:
$this->beginTransaction();
try{
//...执行SQL...
//提交
$this->commit();
} catch(Exception $e){
//回滚
$this->rollback();
}
我们通过beginTransaction()开始一个事务,通过try catch
捕获异常。当执行成功,通过ommit()提交事务并结束,当发生异常失败通过rollBack()进行事务回滚。
主从
很多数据库支持数据库复制 database replication来提高可用性和响应速度。 在数据库复制中,数据总是从主服务器 到 从服务器。 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行。
通过application/configs/application.ini 添加配置可以实现数据库复制和读写分离。
;单从库配置
resources.db.multi_slave_db = false
resources.db.slave_db.adapter = pdo_mysql
resources.db.slave_db.params.host = loclhost
resources.db.slave_db.params.dbname = dbname
resources.db.slave_db.params.username = user
resources.db.slave_db.params.password = password
;多从库配置
resources.db.multi_slave_db = true
resources.db.slave_db.0.adapter = pdo_mysql
resources.db.slave_db.0.params.host = loclhost
resources.db.slave_db.0.params.dbname = dbname
resources.db.slave_db.0.params.username = user
resources.db.slave_db.0.params.password = password
resources.db.slave_db.1.adapter = pdo_mysql
resources.db.slave_db.1.params.host = loclhost
resources.db.slave_db.1.params.dbname = dbname
resources.db.slave_db.1.params.username = user
resources.db.slave_db.1.params.password = password
以上的配置实现了主从的结构,从服务器用以执行读查询,主服务器执行写入查询,读写分离的功能由后台代码自动完成.调用者无须关心。
在特定情景下,开发者需要调用主库查询,SF也提供了很方便的调用方法:
//从主库查询返回结果列表
$this->getDefaultAdapter()->fetchAll();
//从主库查询返回结果集一行数据
$this->getDefaultAdapter()->fetchRow();
//从主库查询返回一个字段
$this->getDefaultAdapter()->fetchOne();
//从主库查询返回结果集第一个字段列表
$this->getDefaultAdapter()->fetchCol();
慢查询
为了快速帮忙开发者检测定位慢查询,SF提供了慢查询配置:
;开启慢查询
resources.db.slow_query_log = true
;执行超过2秒则为慢查询,不设置默认2秒
resources.db.slow_query_time = 2
如果用SQL执行超过设定慢查询时间,会自动记录慢查询日志,日志包含SQL语句和详细堆栈信息,可以快速定位慢查询语句,便于开发者优化。
提示:日志文件位置请参考日志文档