如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。
## 配置文件
在全局或者应用配置目录(不清楚配置目录位置的话参考配置章节)下面的`database.php`中(后面统称为数据库配置文件)配置下面的数据库参数:
~~~
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
],
],
];
~~~
新版采用多类型的方式配置,方便切换数据库。
`default`配置用于设置默认使用的数据库连接配置。
`connections`配置具体的数据库连接信息,`default`配置参数定义的连接配置必须要存在。
`type`参数用于指定数据库类型
| type | 数据库 |
| --- | --- |
| mysql | MySQL |
| sqlite | SqLite |
| pgsql | PostgreSQL|
| sqlsrv | SqlServer |
|mongo|MongoDb|
|oracle|Oracle|
每个应用可以设置独立的数据库连接参数,通常直接更改`default`参数即可:
~~~
return [
'default' => 'admin',
];
~~~
### 连接参数
可以针对不同的连接需要添加数据库的连接参数(具体的连接参数可以参考PHP手册),内置采用的参数包括如下:
~~~
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES => false,
~~~
在数据库配置文件中设置的`params`参数中的连接配置将会和内置的设置参数合并,如果需要使用长连接,并且返回数据库的小写列名,可以在数据库配置文件中增加下面的定义:
~~~
'params' => [
\PDO::ATTR_PERSISTENT => true,
\PDO::ATTR_CASE => \PDO::CASE_LOWER,
],
~~~
> 你可以在`params`参数里面配置任何PDO支持的连接参数。
## 切换连接
我们可以在数据库配置文件中定义多个连接信息
~~~
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
],
'demo' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'demo',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
],
],
];
~~~
我们可以调用`Db::connect`方法动态配置数据库连接信息,例如:
~~~php
\think\facade\Db::connect('demo')
->table('user')
->find();
~~~
>[danger] `connect`方法必须在查询的最开始调用,而且必须紧跟着调用查询方法,否则可能会导致部分查询失效或者依然使用默认的数据库连接。
动态连接数据库的`connect`方法仅对当次查询有效。
>[danger] 这种方式的动态连接和切换数据库比较方便,经常用于多数据库连接的应用需求。
## 模型类定义
如果某个模型类里面定义了`connection`属性的话,则该模型操作的时候会自动按照给定的数据库配置进行连接,而不是配置文件中设置的默认连接信息,例如:
~~~
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $connection = 'demo';
}
~~~
> 需要注意的是,ThinkPHP的数据库连接是惰性的,所以并不是在实例化的时候就连接数据库,而是在有实际的数据操作的时候才会去连接数据库。
## 配置参数参考
下面是默认支持的数据库连接信息:
| 参数名 | 描述 | 默认值 |
| --- | --- | --- |
| type | 数据库类型 | 无 |
| hostname | 数据库地址 | 127.0.0.1 |
| database | 数据库名称 | 无 |
| username | 数据库用户名 | 无 |
| password | 数据库密码 | 无 |
| hostport | 数据库端口号 | 无 |
| dsn | 数据库连接dsn信息 | 无 |
| params | 数据库连接参数 | 空 |
| charset | 数据库编码 | utf8 |
| prefix | 数据库的表前缀 | 无 |
| deploy | 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) | 0 |
| rw\_separate | 数据库读写是否分离 主从式有效 | false |
| master\_num | 读写分离后 主服务器数量 | 1 |
| slave\_no | 指定从服务器序号 | 无 |
| fields\_strict | 是否严格检查字段是否存在 | true |
| fields_cache | 是否开启字段缓存 | false|
|trigger_sql|是否开启SQL监听|true|
| auto\_timestamp | 自动写入时间戳字段 | false |
| query | 指定查询对象 | think\\db\\Query |
常用数据库连接参数(`params`)可以参考[PHP在线手册](http://php.net/manual/zh/pdo.constants.php)中的以`PDO::ATTR_`开头的常量。
如果同时定义了 参数化数据库连接信息 和 dsn信息,则会优先使用dsn信息。
>[danger] 如果是使用`pgsql`数据库驱动的话,请先导入 `/vendor/topthink/think-orm/src/db/connector/pgsql.sql`文件到数据库执行。
## 断线重连
如果你使用的是长连接或者命令行,在超出一定时间后,数据库连接会断开,这个时候你需要开启断线重连才能确保应用不中断。
在数据库连接配置中设置:
~~~
// 开启断线重连
'break_reconnect' => true,
~~~
开启后,系统会自动判断数据库断线并尝试重新连接。大多数情况下都能自动识别,如果在一些特殊的情况下或者某些数据库驱动的断线标识错误还没有定义,支持配置下面的信息:
~~~
// 断线标识字符串
'break_match_str' => [
'error with',
],
~~~
在 `break_match_str`配置中加入你的数据库错误信息关键词。
## 关闭连接
在workerman 和 swoole 等常驻内存的服务模式下使用 ThinkORM,我们可能需要手动关闭连接。这个时候你就可以通过如下的方式关闭:
```
Db::connect()->close();
```
- 序言
- 基础
- 安装
- 开发规范
- 目录结构
- 配置
- 架构
- 请求流程
- 架构总览
- 入口文件
- 多应用模式
- URL访问
- 容器和依赖注入
- 服务
- 门面
- 中间件
- 事件
- 路由
- 路由定义
- 变量规则
- 路由地址
- 路由参数
- 路由中间件
- 路由分组
- 资源路由
- 注解路由
- 路由绑定
- 域名路由
- MISS路由
- 跨域请求
- URL生成
- 控制器
- 控制器定义
- 基础控制器
- 空控制器
- 资源控制器
- 控制器中间件
- 请求
- 请求对象
- 请求信息
- 输入变量
- 请求类型
- HTTP头信息
- 伪静态
- 参数绑定
- 请求缓存
- 响应
- 响应输出
- 响应参数
- 重定向
- 文件下载
- 数据库
- 连接数据库
- 分布式数据库
- 查询构造器
- 查询数据
- 添加数据
- 更新数据
- 删除数据
- 查询表达式
- 链式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- cacheAlways
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- 聚合查询
- 分页查询
- 时间查询
- 高级查询
- 视图查询
- JSON字段
- 子查询
- 原生查询
- 获取查询参数
- 查询事件
- 获取器
- 事务操作
- 存储过程
- 数据集
- 数据库驱动
- 模型
- 定义
- 模型字段
- 新增
- 更新
- 删除
- 查询
- 查询范围
- JSON字段
- 获取器
- 修改器
- 搜索器
- 数据集
- 自动时间戳
- 只读字段
- 软删除
- 类型转换
- 模型输出
- 模型事件
- 模型关联
- 一对一关联
- 一对多关联
- 远程一对多
- 远程一对一
- 多对多关联
- 多态关联
- 关联预载入
- 关联统计
- 关联输出
- 虚拟模型
- 视图
- 模板变量
- 视图过滤
- 模板渲染
- 模板引擎
- 视图驱动
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 调试模式
- Trace调试
- SQL调试
- 变量调试
- 远程调试
- 验证
- 验证器
- 验证规则
- 错误信息
- 验证场景
- 路由验证
- 内置规则
- 表单令牌
- 注解验证
- 杂项
- 缓存
- Session
- Cookie
- 多语言
- 上传
- 命令行
- 启动内置服务器
- 查看版本
- 自动生成应用目录
- 创建类库文件
- 清除缓存文件
- 生成数据表字段缓存
- 生成路由映射缓存
- 输出路由定义
- 自定义指令
- Debug输出级别
- 扩展库
- 数据库迁移工具
- Workerman
- think助手工具库
- 验证码
- Swoole
- 附录
- 助手函数
- 升级指导
- 更新日志