Использование Active Record с несколькими БД
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Использование Active Record с несколькими БД
Рецепт по полноценному использованию AR с несколькими базами данных одновременно.
http://yiiframework.ru/doc/cookbook/ru/ ... .databases
http://yiiframework.ru/doc/cookbook/ru/ ... .databases
Нравится Yii? Давайте сделаем его лучше!.
Re: Использование Active Record с несколькими БД
мне надо взять банеры из другой базы db2. делаю как написано:
сделал модель
и пытаюсь получить в контроллере:
joombanner::model()->findAll();
пишет еррор. что не так?
Код: Выделить всё
'components'=>array(
//…
'db'=>array(
'class'=>'system.db.CDbConnection',
'connectionString'=>'mssql:host=localhost;dbname=db1',
'username'=>'root',
'password'=>'',
'charset'=>'utf8',
),
'db2'=>array(
'class'=>'system.db.CDbConnection',
'connectionString'=>'mysql:host=localhost;dbname=db2',
'username'=>'root',
'password'=>'',
'charset'=>'utf8',
),
//…
),
Код: Выделить всё
class joombanner extends CActiveRecord {
// отдаём соединение, описанное в компоненте db2
public function getDbConnection(){
return Yii::app()->db2;
}
// возвращаем имя таблицы вместе с именем БД
public function tableName(){
return 'db2.jos_banner';
}
//…
}
joombanner::model()->findAll();
пишет еррор. что не так?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Active Record с несколькими БД
Какой именно «еррор»?
Нравится Yii? Давайте сделаем его лучше!.
Re: Использование Active Record с несколькими БД
пардон - я напутал...
но заработало только когда в модели написал имя базы без "db2":
спасибо
но заработало только когда в модели написал имя базы без "db2":
Код: Выделить всё
<?php
class joombanners extends CActiveRecord {
//…
public static function model($className=__CLASS__)
{
return parent::model($className);
}
// отдаём соединение, описанное в компоненте db2
public function getDbConnection(){
return Yii::app()->db2;
}
// возвращаем имя таблицы вместе с именем БД
public function tableName(){
return 'jos_banner';
}
//…
}
?>
-
- Сообщения: 2
- Зарегистрирован: 2012.01.28, 18:23
Re: Использование Active Record с несколькими БД
Доброго времени суток.
Сейчас делаю проект, в котором используются две базы данных - одна собственно разрабатываемого приложения db_A, другая стороннего приложения db_B. В db_B есть таблица Users. Для нее сделана по рецепту сделана модель.
Также в db_A есть таблица Message с вот таким отношением:
Однако при запросах вида
MySQL выдает ошибку доступа к db_B
Возможно ли сделать так, чтобы код Message::model()->with('user_')->findAll() нормально работал без назначения прав на db_B?
Сейчас делаю проект, в котором используются две базы данных - одна собственно разрабатываемого приложения db_A, другая стороннего приложения db_B. В db_B есть таблица Users. Для нее сделана по рецепту сделана модель.
Также в db_A есть таблица Message с вот таким отношением:
Код: Выделить всё
'user_' => array(self::BELONGS_TO, 'Users', 'uid'),
Код: Выделить всё
Message::model()->with('user_')->findAll()
что в принципе понятно, т.к. у пользователя db_A нет прав на db_B и наоборот.SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user 'user1'@'localhost' for table 'users'
Возможно ли сделать так, чтобы код Message::model()->with('user_')->findAll() нормально работал без назначения прав на db_B?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Active Record с несколькими БД
Нет, такой возможности нет. Юзер должен иметь права на обе базы.
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 2
- Зарегистрирован: 2012.01.28, 18:23
Re: Использование Active Record с несколькими БД
Получается только не "жадной" загрузкой вроде $msg->user_->name можно пользоваться?
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Active Record с несколькими БД
В вашем случае да. Это ограничение MySQL.
Нравится Yii? Давайте сделаем его лучше!.
Re: Использование Active Record с несколькими БД
А как в миграциях переключится на другую базу?
Re: Использование Active Record с несколькими БД
$this->dbConnection = Yii::app()->db2;
Re: Использование Active Record с несколькими БД
Можно я покритикую?
Когда-то при разработке одного приложения тимлид предложил делить некоторые вещи на разные БД.
Мы даже попробовали...
Мне понадобилось не много времени, чтобы объяснить об ошибочности выбора такого подхода и мы вернули все таблицы в одну БД.
Толку от этого ни какого нет, так как это всё работает только в пределах одного сервера БД и не даёт ни чего.
Прироста производительности нет.
Тимлид намекал на изоляцию одних данных от других. Но мы работаем с этими данными из одного скрипта, значит нет ни какой изоляции.
Всё это привносит только минус: все запросы обрастают префиксами имени БД.
Когда-то при разработке одного приложения тимлид предложил делить некоторые вещи на разные БД.
Мы даже попробовали...
Мне понадобилось не много времени, чтобы объяснить об ошибочности выбора такого подхода и мы вернули все таблицы в одну БД.
Толку от этого ни какого нет, так как это всё работает только в пределах одного сервера БД и не даёт ни чего.
Прироста производительности нет.
Тимлид намекал на изоляцию одних данных от других. Но мы работаем с этими данными из одного скрипта, значит нет ни какой изоляции.
Всё это привносит только минус: все запросы обрастают префиксами имени БД.
Re: Использование Active Record с несколькими БД
Тогда можно я расскажу плюс?
В своем проекте имеем очень большой объем личных сообщений, логов для админов и логов для пользователей. При этом работоспособность сервиса возможна и без этих данных (несмотря на то, что наличие этих данных - важная штука). Соотношение данных "логов" и "основных данных" - 95%\5%. Выделили логи в отдельную базу данных, включили префиксы к базам, написали дополнительную прослойку, которая позволяет переключаться с логовой базы на основную в случае отсутствия или косяка логовой.
Таким образом, при крахе системы, восстановление основной работы системы займет несколько минут, при этом новые данные будут сохраняться в основную базу (откуда потом скопируются в базу логов). А вот восстановление 10гб+ базы логов займет какое-то время, но это уже не важно.
А ежели вы хотите отделить важные данные от второстепенных жестким щитом - можно задуматься о двух проектах: хранилище данных с API + морда-сайт. Штука жуткая и сложная в поддержании (а в неумелых руках приведет к головной боли всех приближенных к проекту - прецеденты в работе есть), но способствует наличию целостности выполнения задач (нельзя получить кусок данных вместо выполнения полной операции внутри хранилища).
В своем проекте имеем очень большой объем личных сообщений, логов для админов и логов для пользователей. При этом работоспособность сервиса возможна и без этих данных (несмотря на то, что наличие этих данных - важная штука). Соотношение данных "логов" и "основных данных" - 95%\5%. Выделили логи в отдельную базу данных, включили префиксы к базам, написали дополнительную прослойку, которая позволяет переключаться с логовой базы на основную в случае отсутствия или косяка логовой.
Таким образом, при крахе системы, восстановление основной работы системы займет несколько минут, при этом новые данные будут сохраняться в основную базу (откуда потом скопируются в базу логов). А вот восстановление 10гб+ базы логов займет какое-то время, но это уже не важно.
А ежели вы хотите отделить важные данные от второстепенных жестким щитом - можно задуматься о двух проектах: хранилище данных с API + морда-сайт. Штука жуткая и сложная в поддержании (а в неумелых руках приведет к головной боли всех приближенных к проекту - прецеденты в работе есть), но способствует наличию целостности выполнения задач (нельзя получить кусок данных вместо выполнения полной операции внутри хранилища).
Re: Использование Active Record с несколькими БД
Подниму тему и задам вопрос:
Есть два подключения db и db_user. Оба прописаны в соответствующих моделях
PageModel (Подключение db)
UserModel (Подключение db_user соответственно)
Обе модели работают хорошо, а вот relations между ними нет...
PageModel relations
Пишет:
Он почему-то ищет таблицу users не в той БД.. Что делать и как быть?
P.S. Подключения через конфиг одинаковые, разница только в названиях БД
Есть два подключения db и db_user. Оба прописаны в соответствующих моделях
PageModel (Подключение db)
Код: Выделить всё
public function getDbConnection()
{
return Yii::app()->db;
}
public function tableName()
{
return 'Page';
}
Код: Выделить всё
public function getDbConnection()
{
return Yii::app()->db_user;
}
public function tableName()
{
return Yii::app()->getModule('user')->tableUsers;
}
PageModel relations
Код: Выделить всё
public function relations()
{
return array(
'author'=>array(self::BELONGS_TO, 'User', 'id'),
);
}
Код: Выделить всё
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'bsp_index.users' doesn't exist. The SQL statement executed was: SELECT COUNT(DISTINCT `t`.`id`) FROM `Page` `t` LEFT OUTER JOIN `users` `user` ON (`t`.`id`=`user`.`id`) ...
P.S. Подключения через конфиг одинаковые, разница только в названиях БД
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Active Record с несколькими БД
Вы имена таблиц забыли префиксировать именем базы.
Нравится Yii? Давайте сделаем его лучше!.
Re: Использование Active Record с несколькими БД
Пробовал. Пишет, что таблица не найдена. Добавлял естесвенно в функции указания наименования таблицы
Re: Использование Active Record с несколькими БД
Хелп...!!!!
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Использование Active Record с несколькими БД
Возможно версия MySQL старенькая. Раньше оно так не умело.
Нравится Yii? Давайте сделаем его лучше!.