数据库使用
为了简化调用,KaliPHP 框架数据库主要考虑使用 MySQL(ClickHouse),并没有考虑其他数据库的情况,因此并没有很复杂的数据库驱动之类的数据类结构,并且只支持mysqli函数,使用时记得安装mysqli扩展。
db类的成员方法都是静态方法,因此使用时不需要初始化。
连接配置
数据库库信息都配置在app/config/database.php中,也可根据环境配置在database_dev.php/database_pre.php/database_pub.php里面
基本参数如下:
// app/config/database_dev.php
return array(
'config' => array(
// 库名
'name' => 'kali',
// 用户名
'user' => 'root',
// 密码
'pass' => 'pwd',
// 端口号
'port' => 3306,
// 编码格式
'charset' => 'utf8',
// 是否长链接(默认关闭, mysqli的长链问题很多)
'keep-alive' => true,
// 表前缀
'prefix' => 'kali',
// 是否对SQL语句进行安全检查并处理,在插入十万条以上数据的时候会出现瓶颈
'safe_test' => true,
// 慢查询阀值,秒
'slow_query' => 0.5,
// 库IP
'host' => array(
// 主库IP
'master' => '192.168.0.2:3306',
// 从库IP, 支持多个从库,随机链接
'slave' => array('192.168.0.3:3306', '192.168.0.4:3306', '192.168.0.5:3306')
),
// 字段加密key
'crypt_key' => 'key',
// 需要加解密字段, 字段类型记得采用BLOB
'crypt_fields' => array(
'kali_member' => array( 'name', 'email', 'address' ),
),
// JSON类型字段
'json_fields' => array(
'kali_product' => array( 'params' ),
),
)
);如果你有多个项目需要用到同一份配置,只需要把上面的配置放在公共处,在你需要使用处引用
主从操作
框架支持配置不同组别的数据库(MySQL、ClickHouse) ,但是都需要同时配置主从库,从库支持多个,操作数据库时会自动判断,增删改操作主库,查询操作从库
如果需要强制使用主库: 1、程序上下文有对数据修改并且需要立刻获得修改结果的时候,常见于订单生成接口。 2、操作事务的时候,这个时候我们可以在操作的时候指定使用主库:
还可以设置从库状态为 false
切换数据库
框架支持随时切换数据库,比如从 MySQL 切换到 ClickHouse 进行快速查询,记得 ClickHouse 配置也需要同时设置主从配置,但是信息可以一样
基础查询
$is_master 是读写分离参数,默认false为智能操作,查询操作从库,增删改操作主库,true为强制操作主库
返回值
返回值是根据查询类型而变化的
SELECT: 1、无数据返回 array() 2、默认返回多维数组 3、使用as_sql()后返回将要执行的SQL 4、使用as_row()后返回一维数组 5、使用as_field()后返回第一个元素 6、使用as_result()后返回结果集
INSERT: array( insert id, affected rows )
UPDATE & DELETE: affected rows
查询数据
查询数据支持两种字段选择方式:字符串(字段以逗号隔开)、数组,如果需要使用db::expr()方法,请使用数组方式
增加数据
单条数据增加可采用set方法, 成功返回(自增ID 和 受影响行数)
批量增加数据可采用columns和values组合方法
修改数据
单字段修改可采用value方法, 成功返回(受影响行数)
多字段修改可采用set方法
删除数据
删除操作成功返回(受影响行数)
多联表
框架支持多连表模型: join(全联接),left join(左联接),right join(右联接)方法
多次使用join方法可以继续联接,理论上可以建立任意数量的关联表。
选择器
选择器用于筛选表内数据,参数可以为两个或者三个,两个相当于=号省略不写。
IN、BETWEEN等多值方式需要传递一维数组参数
多条件查询可采用数组或者迭代调用
复杂选择
除了正常的匹配选择以外,框架还提供了其他复杂选择器。
其他条件
order by语句支持迭代调用方式
group by语句单字段情况下传递字符串即可,多字段需要传递数组
Limit && Offset
防止构建
正常情况下,传递参数进去后会被构建器重新构建成表达式,expr方法会返回一个db_expression类对象,可以防止表达式被重新构建,保留它原来的样子。
JSON字段
JSON字段需要在Mysql中设置好字段类型为json,然后在 config/database.php 文件中配置好参数:
配置好后,对当前字段操作只要传入array,便会自动转为json字符串,不需要json_encode
添加字段
更新字段
更新一定要注意的是,如果原先是a、b、c三个参数,只传入a、b参数,c并不会被删除,仅仅是更新了a、b的值而已,如果要整个字段修改,需要使用json_encode($data)
查询字段
SQL模版
框架中提供了上述选择器,条件语句,联表等,基本覆盖了所有sql语法,但可能还有部分生僻的用法无法被实现, 于是这里提供了一种SQL模版的使用方式,支持用户自定义SQL语句,但并不推荐用户使用,如果一定要使用的话,请务必自己做好防SQL注入
你可以使用框架提供的标准占位符,他是一个字符串,以冒号(:varname)为前缀。
多个参数绑定采用数组穿参
游标数据
如果DB中取出的数据非常大,而PHP中却无法承受这么大量的内存可以用来处理,这时候就需要用到游标了
游标可以将复合条件的数据逐一取出,在程序中进行分批处理,从而降低大数据所带来的内存瓶颈
事务处理
框架提供了一套简单的事务处理机制,默认是关闭的,可以通过db::start()方法开启
注意:请确保连接的数据表是innodb的存储引擎,否者事务并不会生效。
在db::start()之后可以通过db::commit()来进行完整事务的提交保存,但并不会影响start之前的操作
同理,可以通过db::rollback()进行整个事务的回滚,回滚所有当前未提交的事务
当程序调用db::end()方法后事务会全部终止,未提交的事务也会自动回滚,另外,程序析构时,也会自动回滚未提交的事务
另外,事务的开启并不会影响select操作,只对增加,删除,修改操作有影响
还有就是,框架默认是主从操作以缓解数据库查询压力,但是数据库主从同步需要时间而且远比PHP执行效率要低,开始事务、回滚事务、提交事务、关闭事务会自动调用主库,增加,删除,修改操作也会自动调用主库,所以用户只需要在查询操作时强制使用主库( execute(true) )即可
数据缓存
尚未实现。
语句调试
SQL调试方法已经集成在框架事件中,只需要在需要调试语句的方法前调用event::on(onSql)就可以在页面控制台中输出sql语句了
该SQL事件功能还可自行绑定方法,具体用法会在后面事件介绍中详细展开
Last updated
Was this helpful?