Yii连接多个数据库的方法
一、配置多数据库
大多数情况下,我们都会采用同一类型的数据库,只是为了缓解压力分成主从或分布式形式而已。声明你可以在
主配置文件
(
main.php
)
中里声明其它的数据库连接:
<?php
......
'components'=>array(
'db'=>....//
主链接
'db1'=>...//
从连接
1
'db2'=>...//
从连接
2
)
......
操作在代码里,可以通过
Yii::app()->db1
和
Yii::app()->db2
获得两个从连接。
'db1'
=>
array
(
'class'
=>
'CDbConnection'
,
'connectionString'
=>
'mysql:host=localhost;dbname=test;charset=
…
'
,
'emulatePrepare'
=>
true
,
'username'
=>
'test'
,
'password'
=>
'test'
,
'charset'
=>
'utf8'
,
)
,
第二个以后的
db1
数组中一定要写上
class
参数,让
Yii
知道你在定义一个数据库连接对象,不然会报错。
一旦我们这样定义以后,就可以通过
Yii::app()->db1
来指向第二个数据库了。
二、重载
GetDbConnection()
方法
因为每个
Model
都是(直接或者间接地)继承自基类
CActiveRecord
的,因此,都包含
GetDbConnection()
这个方法,
GetDbConnection()
返回一个数据库连接对象的句柄。我们需要
在模型(
model
)里面通过重载这个方法来返回我们需要的数据库对象。
然后,假设我们新建了一文件
:
protected/components/Sub1ActiveRecord.php
,然后在你的所有要用
db1
这
个数据库的
model
里
extend Sub1ActiveRecord
而不是
CActiveRecord
。
这里我们是通过扩展
Yii
通用类来定义一个新的类,
而不是在每个模型里面都重
载
getDbConnection
方法,
这样做的好处是更大程度上的代码重用,
节省时间。
重载代码如下:
// protected/components/MyActiveRecord.php
class
Sub1
ActiveRecord
extends
CActiveRecord
{
public
function
getDbConnection
()
{
if
(
self
::
$db
!==
null
)
return
self
::
$db
;
else
{
//
这里就是我们要修改的
self
::
$db
=
Yii
::
app
()
->
getComponent
(
'db1'
)
;
//self::$db=Yii::app()->db1;
if
(
self
::
$db
instanceof CDbConnection
)
return
self
::
$db
;
else
throw
new
CDbException
(
Yii
::
t
(
'yii'
,
'Active Record requires a
"db1" CDbConnection application component.'
))
;
}
}
...........
}
三,在模型中使用
经过以上两步以后,我们就可以这样来用:
1
2
3
4
5
// protected/models/Ad.php
class
Ad
extends
Sub1ActiveRecord
{
...
}
Yii连接多个数据库的方法的更多相关文章
- 详解连接SQL Server数据库的方法,并使用Statement接口实现对数据库的增删改操作
总结一下,连接SQL Server数据库需要以下几个步骤: 1. 导入驱动Jar包:sqljdbc.jar 2. 加载并注册驱动程序 3. 设置连接路径 4. 加载并注册驱动 5. 连接数据库 6. ...
- 远程连接sql server 数据库的方法
今天找了半天,终于解决了如何从本地连接到远程sql server服务器的方法. 1.首先确保打开远程服务器的sql server配置管理器,确保TCP/IP协议开启 2.WebConfig的连接字符格 ...
- Python基于Pymssql模块实现连接SQL Server数据库的方法
首先,安装pymssql第三方库pip install pymssql 其次,导入pymssql库 最后们就可以连接数据库了 import pymssql server = "10.10.9 ...
- FireDAC 连接access MDB数据库的方法
Use Cases Open the Microsoft Access database. DriverID=MSAcc Database=c:\mydata.mdb Open the Microso ...
- 【转】Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- Java 通过JDBC连接Mysql数据库的方法和实例
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- 通过MSSQL连接服务器连接至Oracle数据库
前言 有很多时候,我们需要MSSQL与Oracle进行跨库查询或数据交互.本篇随笔将阐述如何通过MSSQL的连接服务器连接至Oracle数据库,并且读取数据的示例. 具体步骤 首先需要到Oracle的 ...
- ThinkPHP连接sql server数据库
亲身经历,在网上找连接sql server数据库的方法,还是不好找的,大多数都是照抄一个人的,而这个人的又写的不全,呵呵,先介绍一下我连接的方法吧.如果你是用THINKPHP连接,那么最重要的就是配置 ...
随机推荐
- 利用反射完成初级万能DAO
一.目标 利用反射完成初级万能DAO 二.注意 1.Field[] fi = clazz.getDeclaredFields(); for(Field ff : fi){ ff.setAccessib ...
- JLink v8克隆版破解向导(此方法仅适用XP32位版 WIN7及以上和64位均不支持 建议使用虚拟机)
此方法仅适用XP32位版 WIN7及以上和64位均不支持 建议使用虚拟机 摘要 Jlink 4.5版本之后驱动会识别老的克隆版的JlinkV8,Jlink软件在启动时会提示为克隆版本后退出.目前主流的 ...
- Linux服务器沦陷为肉鸡的全过程实录
1 从防火墙瘫痪说起 2015年3月10日,还没到公司就被电话告知办公室无法正常连接互联网了,网速非常慢,无法正常浏览网页.急急忙忙感到公司,开始查找问题. 首先排除了交换机故障,因为内部局域网正常. ...
- Linux系统文件权限&目录权限
linux系统一切都是文件,文件和目录的所属与权限--来分别规定所有者.所有组.其余人的读.写.执行权限. 读(read),写(write),执行(excute)简写为(r.w.x),也可以以用(4. ...
- ES6入门之函数的扩展
函数js原有的: 属性:arguments[].caller(调用该函数的引用,注意与callee分别开,callee指的是调用函数本身经常在递归中出现).length(形参个数).prototype ...
- zabbix接口调用注意事项--Python
不知道该怎么写,但是明显得写点什么,担心时间长了,忘记,再回顾时又要重新摸索一遍 一.Request:post params: 1. 第一层的参数处理: 第一层的参数设置为变量 2. 其他层参数格式不 ...
- bootrom启动流程【转】
转自:http://blog.csdn.net/blueoceanindream/article/details/6851787 闲来无事,总结一下linux bootrom的启动流程: 环境:MIP ...
- git checkout not discard changes
1. checkout one branch, show status user@vbox:/mnt/tmp$ git checkout masterSwitched to branch 'maste ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
- GMT与UTC
时间概念 — 24时区.GMT.UTC的意涵 许多人都知道两地时间表简称为GMT或UTC,而世界时区表则通称为World Time ,那么GMT与UTC的实质原意又是为何?世界时区又是怎么区分的?面盘 ...