数据库配置指南
1. 配置文件
数据库配置文件位于:
common/config/db.php
2. 基本配置
2.1 创建数据库连接
想要访问数据库,你首先需要通过创建一个 yii\db\Connection 实例来与之建立连接:
$db = new yii\db\Connection([
'dsn' => 'mysql:host=localhost;dbname=example',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
]);
2.2 应用组件配置
因为数据库连接经常需要在多个地方使用到,一个常见的做法是以应用组件的方式来配置它:
return [
// ...
'components' => [
// ...
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=example',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
],
// ...
];
之后你就可以通过语句 Yii::$app->db 来使用数据库连接了。
提示:如果你的应用需要访问多个数据库,你可以配置多个 DB 应用组件。
3. DSN 格式
配置数据库连接时,你应该总是通过 dsn 属性来指明它的数据源名称 (DSN)。不同的数据库有着不同的 DSN 格式:
| 数据库 | DSN 格式 |
|---|---|
| MySQL, MariaDB | mysql:host=localhost;dbname=mydatabase |
| SQLite | sqlite:/path/to/database/file |
| PostgreSQL | pgsql:host=localhost;port=5432;dbname=mydatabase |
| CUBRID | cubrid:dbname=demodb;host=localhost;port=33000 |
| MS SQL Server (sqlsrv) | sqlsrv:Server=localhost;Database=mydatabase |
| MS SQL Server (dblib) | dblib:host=localhost;dbname=mydatabase |
4. 高级配置
4.1 连接池配置
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=example',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'tablePrefix' => 'dd_', // 表前缀
'enableSchemaCache' => true, // 启用模式缓存
'schemaCacheDuration' => 3600, // 模式缓存持续时间
'enableQueryCache' => true, // 启用查询缓存
'queryCacheDuration' => 60, // 查询缓存持续时间
],
4.2 读写分离配置
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=example',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'slaveConfig' => [
'username' => 'slave',
'password' => 'slave',
'attributes' => [
PDO::ATTR_TIMEOUT => 10,
],
],
'slaves' => [
['dsn' => 'mysql:host=slave1;dbname=example'],
['dsn' => 'mysql:host=slave2;dbname=example'],
],
],
5. 环境变量配置
推荐使用环境变量来存储数据库配置,提高安全性:
5.1 .env 文件配置
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_NAME=example
DB_USER=root
DB_PASSWORD=123456
5.2 配置文件读取
return [
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=' . getenv('DB_HOST') . ';dbname=' . getenv('DB_NAME'),
'username' => getenv('DB_USER'),
'password' => getenv('DB_PASSWORD'),
'charset' => 'utf8',
],
],
];
6. 常见问题
6.1 连接失败
可能原因:
- 数据库服务未启动
- 主机名或端口错误
- 用户名或密码错误
- 防火墙阻止连接
解决方案:
- 检查数据库服务状态
- 验证连接参数
- 检查防火墙设置
- 测试网络连接
6.2 字符集问题
可能原因:
- 数据库字符集与应用字符集不匹配
- 表或字段字符集设置错误
解决方案:
- 确保数据库、表和字段都使用 UTF-8 字符集
- 在连接配置中指定
charset => 'utf8'
6.3 性能问题
可能原因:
- 缺少索引
- 查询语句效率低下
- 连接数过多
解决方案:
- 为常用查询字段添加索引
- 优化查询语句
- 配置连接池
- 启用缓存
7. 最佳实践
- 使用环境变量:避免在代码中硬编码敏感信息
- 启用缓存:提高数据库操作性能
- 使用参数绑定:防止 SQL 注入
- 合理使用事务:确保数据一致性
- 定期备份:防止数据丢失
- 监控性能:及时发现和解决性能问题
- 遵循命名规范:使用统一的表名和字段名命名规范
8. 参考链接
9. 其他数据库支持
Yii2 还支持其他类型的数据库,以下是一些常见数据库的 DSN 格式:
| 数据库 | DSN 格式 |
|---|---|
| MS SQL Server (mssql) | mssql:host=localhost;dbname=mydatabase |
| Oracle | oci:dbname=//localhost:1521/mydatabase |
| ODBC | odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mydb.mdb |
注意:如果你是通过 ODBC 来连接数据库,你应该配置
yii\db\Connection::$driverName属性,以便 Yii 能够知道实际的数据库种类。
9.1 ODBC 连接示例
'db' => [
'class' => 'yii\db\Connection',
'driverName' => 'mysql',
'dsn' => 'odbc:Driver={MySQL};Server=localhost;Database=test',
'username' => 'root',
'password' => '',
],
10. 连接管理
10.1 延迟连接
当你实例化一个 DB Connection 时,直到你第一次执行 SQL 或者你明确地调用 open() 方法时,才建立起实际的数据库连接。
10.2 连接初始化
有时你可能想要在建立起数据库连接时立即执行一些语句来初始化一些环境变量(比如设置时区或者字符集),你可以通过为数据库连接的 afterOpen 事件注册一个事件处理器来达到目的:
'db' => [
// ...
'on afterOpen' => function($event) {
// $event->sender refers to the DB connection
$event->sender->createCommand("SET time_zone = 'UTC'")->execute();
}
],
11. 配置参考
除了 dsn、username 和 password 属性外,yii\db\Connection 还支持许多其他配置属性。请参考 Yii2 数据库连接文档 来获取完整的可配置属性列表。
