基础功能

SF 目前只支持Mysql数据库,提供mysqli和pdo_mysql两种适配方式。

配置

配置文件application/configs/application.ini 添加数据库配置:

  1. ;数据库适配器 mysqlipdo_mysql
  2. resources.db.adapter = pdo_mysql
  3. ;数据库表明前缀
  4. resources.db.prefix =
  5. resources.db.params.host = loclhost
  6. resources.db.params.dbname = dbname
  7. resources.db.params.username = user
  8. resources.db.params.password = password

一般来说,db model是一个数据库的访问入口,Star_Model_Abstract继承,更特殊的是,它是某个特定数据库表会的访问入口。每个model使用数据表,例如,Usermodel使用'user'表。下面是一个简单的User model在SF中的demo:

  1. <?php
  2. class UserModel extends Star_Model_Abstract
  3. {
  4. protected $_name = "users";
  5. protected $_primary = "user_id";
  6. }
  7. ?>
提示:1.实例化model并不会开始链接数据库,只有执行SQL语句才会开始链接数据库,使用缓存不增数据库压力。2.每张表必须包含自增主键,不然会造成model操作失败,养成一种良好的习惯。

操作

insert

  • data //插入数据
    返回last_insert_id
  1. //返回last_insert_id
  2. $this->insert(array(
  3. "username" => "john",
  4. "age"; => 25,
  5. ));

update

  • where //更新条件
  • data //更新数据
  • quote_indentifier //是否给data数据添加添加引号处理 默认true
    返回影响行数
  1. //直接传数字表示主键值,等于更新user_id=1
  2. $this->update(1, array("age" => 26));
  3. $this->update("username" => "john", array("age" => 27));
  4. //表示给user_id=1的用户年龄加1
  5. $this->update(1, array("age" => "age + 1"), false);

delete

  • where //删除条件
    返回影响行数
  1. //直接传数字表示主键值,等于删除user_id=1的数据
  2. $this->delete(1);
  3. //删除用户名等于john的数据
  4. $this->delete("username" => "john");

query

  • sql //sql语句
    查询返回结果集,操作返回影响行数

查询

getPk

  • pk_id //主键ID
    返回主键信息
  1. //执行SQL:SELECT * FROM `users` WHERE (user_id = 1) limit 1; 返回user_id=1的用户信息
  2. $this->getPk(1);

fetchAll

  • where //查询条件
  • conditions //查询字段 默认 *,返回所有字段
  • order //排序 默认 null, null表示没有排序
  • page //当前页数 默认null, null表示没有限制
  • page_size //限制多少数据 默认null, null表示没有限制
    返回结果集列表
  1. //执行SQL:SELECT * FROM `users` WHERE (age > 18) ORDER BY age ASC LIMIT 20 OFFSET 0,返回前面20条年龄大于18的所有用户列表,按照年龄升序排序
  2. $this->fetchAll("age > 18", "*", "age ASC", 1, 20);
  3. //执行SQL: SELECT user_id, age FROM `users` WHERE (age > 18) ORDER BY age ASC, 返回年龄大于18的所有用户列表,按照年龄升序排序
  4. $this->fetchAll("age> 18", array("user_id", "age"), "age ASC");
  5. //执行SQL:SELECT user_id as id, age FROM `users` WHERE (age > 18) ORDER BY age ASC,返回年龄大于18的所有用户列表,按照年龄升序排序
  6. $this->fetchAll("age > 18" array("id" => "user_id", "age"), "age ASC");
  7. //执行SQL: SELECt * FROM `users` WHERE (age > 18) ORDER BY age ASC, user_id ASC,返回年龄大于18的所有用户列表,按照年龄和user_id升序排序
  8. $this->fetchAll("age > 18", "*", array("age ASC", "user_id ASC"));

fetchRow

  • where //查询条件
  • conditions //查询字段 默认 * 返回所有字段
  • order //排序 默认 null, null表示没有排序
    返回第一行结果集数据
  1. //执行SQL:SELECT * FROM `users` WHERE (user_id = 1) LIMIT 1,返回user_id = 1的用户信息
  2. $this->fetchRow("user_id = 1");

fetchOne

  • where //查询条件
  • conditions //查询字段 默认 * 返回所有字段
  • order //排序 默认 null, null表示没有排序
    只返回第一个字段值
  1. //执行SQL:SELECT count(1) FROM `users` WHERE (age > 18); 返回年龄大于18的用户数
  2. $this->fetchOne("age > 18", "count(1)");

fetchCol

  • where //查询条件
  • conditions //查询字段 默认 *,返回所有字段
  • order //排序 默认 null, null表示没有排序
  • page //当前页数 默认null, null表示没有限制
  • page_size //限制多少数据 默认null, null表示没有限制
    返回所有结果集的第一个字段列表
  1. //执行SQL: SELECT user_id FROM `users` WHERE (age > 18); 返回所有年龄大于18用户的user_id
  2. $this->fetchCol("age > 18", "user_id");

事务

当你需要顺序执行多个相关的的query时,你可以把他们封装到一个事务中去保护数据一致性。SF提供了一个简单的接口来实现事务操作。 如下执行 SQL 事务查询语句:

  1. $this->beginTransaction();
  2. try{
  3. //...执行SQL...
  4. //提交
  5. $this->commit();
  6. } catch(Exception $e){
  7. //回滚
  8. $this->rollback();
  9. }

我们通过beginTransaction()开始一个事务,通过try catch 捕获异常。当执行成功,通过ommit()提交事务并结束,当发生异常失败通过rollBack()进行事务回滚。

主从

很多数据库支持数据库复制 database replication来提高可用性和响应速度。 在数据库复制中,数据总是从主服务器从服务器。 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行。

通过application/configs/application.ini 添加配置可以实现数据库复制和读写分离。

  1. ;单从库配置
  2. resources.db.multi_slave_db = false
  3. resources.db.slave_db.adapter = pdo_mysql
  4. resources.db.slave_db.params.host = loclhost
  5. resources.db.slave_db.params.dbname = dbname
  6. resources.db.slave_db.params.username = user
  7. resources.db.slave_db.params.password = password
  8. ;多从库配置
  9. resources.db.multi_slave_db = true
  10. resources.db.slave_db.0.adapter = pdo_mysql
  11. resources.db.slave_db.0.params.host = loclhost
  12. resources.db.slave_db.0.params.dbname = dbname
  13. resources.db.slave_db.0.params.username = user
  14. resources.db.slave_db.0.params.password = password
  15. resources.db.slave_db.1.adapter = pdo_mysql
  16. resources.db.slave_db.1.params.host = loclhost
  17. resources.db.slave_db.1.params.dbname = dbname
  18. resources.db.slave_db.1.params.username = user
  19. resources.db.slave_db.1.params.password = password

以上的配置实现了主从的结构,从服务器用以执行读查询,主服务器执行写入查询,读写分离的功能由后台代码自动完成.调用者无须关心。

在特定情景下,开发者需要调用主库查询,SF也提供了很方便的调用方法:

  1. //从主库查询返回结果列表
  2. $this->getDefaultAdapter()->fetchAll();
  3. //从主库查询返回结果集一行数据
  4. $this->getDefaultAdapter()->fetchRow();
  5. //从主库查询返回一个字段
  6. $this->getDefaultAdapter()->fetchOne();
  7. //从主库查询返回结果集第一个字段列表
  8. $this->getDefaultAdapter()->fetchCol();

慢查询

为了快速帮忙开发者检测定位慢查询,SF提供了慢查询配置:

  1. ;开启慢查询
  2. resources.db.slow_query_log = true
  3. ;执行超过2秒则为慢查询,不设置默认2
  4. resources.db.slow_query_time = 2

如果用SQL执行超过设定慢查询时间,会自动记录慢查询日志,日志包含SQL语句和详细堆栈信息,可以快速定位慢查询语句,便于开发者优化。

提示:日志文件位置请参考日志文档