ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操 作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。采用 PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。

  如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。

  • 一、配置文件定义
  • 二、方法配置
  • 三、模型类定义
  • 配置参数参考

一、配置文件定义

常用的配置方式是在应用目录或者模块目录下面的 database.php 中添加下面的配置参数:

  1. return [
  2.   // 数据库类型
  3.   'type' => 'mysql',
  4.   // 数据库连接DSN配置
  5.   'dsn' => '',
  6.   // 服务器地址
  7.   'hostname' => '127.0.0.1',
  8.   // 数据库名
  9.   'database' => 'thinkphp',
  10.   // 数据库用户名
  11.   'username' => 'root',
  12.   // 数据库密码
  13.   'password' => '',
  14.   // 数据库连接端口
  15.   'hostport' => '',
  16.   // 数据库连接参数
  17.   'params' => [],
  18.   // 数据库编码默认采用utf8
  19.   'charset' => 'utf8',
  20.   // 数据库表前缀
  21.   'prefix' => 'think_',
  22.   // 数据库调试模式
  23.   'debug' => false,
  24.   // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
  25.   'deploy' => 0,
  26.   // 数据库读写是否分离 主从式有效
  27.   'rw_separate' => false,
  28.   // 读写分离后 主服务器数量
  29.   'master_num' => 1,
  30.   // 指定从服务器序号
  31.   'slave_no' => '',
  32.   // 是否严格检查字段是否存在
  33.   'fields_strict' => true,
  34. ];

type 参数支持命名空间完整定义,不带命名空间定义的话,默认采用 \think\db\connector 作为命名 空间,如果使用应用自己扩展的数据库驱动,可以配置为:

  1. // 数据库类型
  2. 'type' => '\org\db\Mysql',

表示数据库的连接器采用 \org\db\Mysql 类作为数据库连接驱动,而不是默认的 \think\db\connector\Mysql 。

每个模块可以设置独立的数据库连接参数,并且相同的配置参数可以无需重复设置,例如我们可以在admin模 块的database.php配置文件中定义:

  1. return [
  2.   // 服务器地址
  3.   'hostname' => '192.168.1.100',
  4.   // 数据库名
  5.   'database' => 'admin',
  6. ];

表示admin模块的数据库地址改成 192.168.1.100 ,数据库名改成 admin ,其它的连接参数和应用的 database.php 中的配置一样。

V5.0.6+ 版本开始,支持Mysql的断线重连机制,默认关闭,需要的话,是数据库配置文件中添加:

  1. // 开启断线重连
  2. 'break_reconnect' => true,

连接参数

可以针对不同的连接需要添加数据库的连接参数(具体的连接参数可以参考PHP手册),内置采用的参数包括 如下:

  1. PDO::ATTR_CASE => PDO::CASE_NATURAL,
  2. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  3. PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
  4. PDO::ATTR_STRINGIFY_FETCHES => false,
  5. PDO::ATTR_EMULATE_PREPARES => false,

在database中设置的params参数中的连接配置将会和内置的设置参数合并,如果需要使用长连接,并且返回 数据库的小写列名,可以采用下面的方式定义:

  1. 'params' => [
  2.   \PDO::ATTR_PERSISTENT => true,
  3.   \PDO::ATTR_CASE => \PDO::CASE_LOWER,
  4. ],

你可以在params里面配置任何PDO支持的连接参数。

二、方法配置

我们可以在调用Db类的时候动态定义连接信息,例如:

  1. Db::connect([
  2. // 数据库类型
  3. 'type' => 'mysql',
  4. // 数据库连接DSN配置
  5. 'dsn' => '',
  6. // 服务器地址
  7. 'hostname' => '127.0.0.1',
  8. // 数据库名
  9. 'database' => 'thinkphp',
  10. // 数据库用户名
  11. 'username' => 'root',
  12. // 数据库密码
  13. 'password' => '',
  14. // 数据库连接端口
  15. 'hostport' => '',
  16. // 数据库连接参数
  17. 'params' => [],
  18. // 数据库编码默认采用utf8
  19. 'charset' => 'utf8',
  20. // 数据库表前缀
  21. 'prefix' => 'think_',
  22. ]);

或者使用字符串方式:

  1. Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');

字符串连接的定义格式为:

  数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集

注意:字符串方式可能无法定义某些参数,例如前缀和连接参数。

如果我们已经在应用配置文件(注意这里不是数据库配置文件)中配置了额外的数据库连接信息,例如:

  1. //数据库配置1
  2. 'db_config1' => [
  3. // 数据库类型
  4. 'type' => 'mysql',
  5. // 服务器地址
  6. 'hostname' => '127.0.0.1',
  7. // 数据库名
  8. 'database' => 'thinkphp',
  9. // 数据库用户名
  10. 'username' => 'root',
  11. // 数据库密码
  12. 'password' => '',
  13. // 数据库编码默认采用utf8
  14. 'charset' => 'utf8',
  15. // 数据库表前缀
  16. 'prefix' => 'think_',
  17. ],
  18. //数据库配置2
  19. 'db_config2' => 'mysql://root:1234@localhost:3306/thinkphp#utf8';

我们可以改成

  1. Db::connect('db_config1');
  2. Db::connect('db_config2');

三、模型类定义

如果在某个模型类里面定义了 connection 属性的话,则该模型操作的时候会自动连接给定的数据库连接, 而不是配置文件中设置的默认连接信息,通常用于某些数据表位于当前数据库连接之外的其它数据库,例 如:

  1. //在模型里单独设置数据库连接信息
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model
  5. {
  6. protected $connection = [
  7. // 数据库类型
  8. 'type' => 'mysql',
  9. // 数据库连接DSN配置
  10. 'dsn' => '',
  11. // 服务器地址
  12. 'hostname' => '127.0.0.1',
  13. // 数据库名
  14. 'database' => 'thinkphp',
  15. // 数据库用户名
  16. 'username' => 'root',
  17. // 数据库密码
  18. 'password' => '',
  19. // 数据库连接端口
  20. 'hostport' => '',
  21. // 数据库连接参数
  22. 'params' => [],
  23. // 数据库编码默认采用utf8
  24. 'charset' => 'utf8',
  25. // 数据库表前缀
  26. 'prefix' => 'think_',
  27. ];
  28. }

也可以采用DSN字符串方式定义,例如:

  1. //在模型里单独设置数据库连接信息
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model
  5. {
  6. //或者使用字符串定义
  7. protected $connection = 'mysql://root:1234@127.0.0.1:3306/thinkphp#utf8';
  8. }

需要注意的是,ThinkPHP的数据库连接是惰性的,所以并不是在实例化的时候就连接数据库,而是在有实 际的数据操作的时候才会去连接数据库。

配置参数参考

下面是默认支持的数据库连接信息:

参数名 描述 默认值
type 数据库类型
hostname 数据库地址 127.0.0.1
database 数据库名称
username 数据库用户名
password 数据库密码
hostport 数据库端口号
dsn 数据库连接dsn信息
params 数据库连接参数
charset 数据库编码 utf8
prefix 数据库的表前缀
debug 是否调试模式 false
deploy 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 0
rw_separate 数据库读写是否分离 主从式有效 false
master_num 读写分离后 主服务器数量 1
slave_no 指定从服务器序号
fields_strict 是否严格检查字段是否存在 true
resultset_type 数据集返回类型 array
auto_timestamp 自动写入时间戳字段 false
sql_explain 是否需要进行SQL性能分析 开启调试有效 false
query 指定查询对象 think\db\Query
builder 指定数据库Builder对象

注意:

  如果是使用 pgsql 数据库驱动的话,请先导入 thinkphp/library/think/db/connector/pgsql.sql 文件到数据库执行。

ThinkPHP 数据库操作(一) : 连接数据库的更多相关文章

  1. thinkPHP数据库操作

    thinkPHP如果要对数据库操作,一般来说首先要做的是在配置文件中链接数据库,然后用M方法实例化一张表,然后就是对表的操作了 可以开启调试功能查看程序执行的sql语句: 1.开启调试功能(默认是已经 ...

  2. ThinkPHP 数据库操作(五) : 存储过程、数据集、分布式数据库

    存储过程 5.0支持存储过程,如果我们定义了一个数据库存储过程 sp_query ,可以使用下面的方式调用: $result = Db::query('call sp_query(8)'); 返回的是 ...

  3. 扣出thinkphp数据库操作类

    假如你是一位thinkphp的使用者,想必你会觉得thinkphp操作数据库非常方便.现在在你面前有一个非常小的作业,小到完全没有必要用thinkphp去完成它.但是你又觉得不用thinkphp的话, ...

  4. ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )

    一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function te ...

  5. ThinkPHP 数据库操作(七) : 视图查询、子查询、原生查询

    视图查询 视图查询可以实现不依赖数据库视图的多表查询,并不需要数据库支持视图,例如: Db::view('User','id,name') ->view('Profile','truename, ...

  6. ThinkPHP 数据库操作(三) : 查询方法、查询语法、链式操作

    查询方法 条件查询方法 where 方法 可以使用 where 方法进行 AND 条件查询: Db::table('think_user') ->where('name','like','%th ...

  7. ThinkPHP 数据库操作(二) : 增删改查

    基本使用 可以直接使用数据库运行原生SQL操作了,支持 query (查询操作)和 execute (写入操作)方法,并且支持参数绑定. Db::query('select * from think_ ...

  8. ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL

    查询事件 查询事件(V5.0.4+) 从 5.0.4+ 版本开始,增加了数据库的CURD操作事件支持,包括: 查询事件仅支持 find . select . insert . update 和 del ...

  9. ThinkPHP 数据库操作(四) : 聚合查询、时间查询、高级查询

    聚合查询 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数.所有用户的最大积分.用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 用法示例: ...

随机推荐

  1. MyCat全局表和ER--笔记(三)

    全局表 全局表的作用 在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,考虑到字典表具有以下几个特性: 变动不频繁 数据量总体变化不大 数据规模 ...

  2. 简单使用sp_executesql 参数化

    declare @totalCount1 int output declare @id1 varchar(10) declare @strsql1 nvarchar(max)=N'' declare ...

  3. python全栈开发day117-MongoDB,pymongo

    1.MongoDB操作 使用了不存在的对象即创建该对象 1.增加: 官方不推荐写法: insert([{},{},{}]) 官方推荐写法: insertOne({}) insertMany([{},{ ...

  4. 咸鱼入门到放弃12--Filter(过滤器)*

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  5. sublime2 nodejs 执行编译无反应

    这个问题困扰了我得一周了,好不容易解决了, 一.问题描述: 安装网上的一些教程在sublime text 2 里面安装Nodejs 的编译环境,但是安装完之后执行编译没有任何输出信息,编译没有反应,只 ...

  6. 结队第一次 plus

    作业描述 作业所属课程:软件工程1916|W(福州大学) 作业要求:结对第一次-原型设计 结对学号:221600328 221600106 作业目标:尝试结对合作,使用NABCD模型,会分析用户需求, ...

  7. Python操作Excel, 开发和调用接口,发送邮件

    笔记: 上周回顾: 模块: 导入模块的顺序 lyl.py # def hhh(): pass name = 'lyl' a.py import lyl import sys from lyl impo ...

  8. 近期待学习&目标内容

    算法 Splay 树链剖分 AC自动机 问题 bzoj1010[HNOI2008]玩具装箱 bzoj1096[ZJOI2007]仓库建设 bzoj1597[USACP2008 Mar]土地购买 bzo ...

  9. C++ otlv4 连接 sql server 数据库小记

    otlv4介绍: http://otl.sourceforge.net/ 测试代码 // testotlv4.cpp : 定义控制台应用程序的入口点. // #include "stdafx ...

  10. Ubuntu wpa 代替network-manager

    1. Ubuntu启动时,如果出现60秒等待:Waiting up to 60 seconds for network configuration 解决方法: a. /etc/init ,打开fail ...