Использование Active Record с несколькими БД

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Использование Active Record с несколькими БД

Сообщение samdark »

Рецепт по полноценному использованию AR с несколькими базами данных одновременно.

http://yiiframework.ru/doc/cookbook/ru/ ... .databases
herbary
Сообщения: 4
Зарегистрирован: 2010.06.25, 14:37

Re: Использование Active Record с несколькими БД

Сообщение herbary »

мне надо взять банеры из другой базы db2. делаю как написано:

Код: Выделить всё

'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 с несколькими БД

Сообщение samdark »

Какой именно «еррор»?
herbary
Сообщения: 4
Зарегистрирован: 2010.06.25, 14:37

Re: Использование Active Record с несколькими БД

Сообщение herbary »

пардон - я напутал...
но заработало только когда в модели написал имя базы без "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';
    }  
 
    //…
}
?>

спасибо
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Использование Active Record с несколькими БД

Сообщение Ekstazi »

Джумла ?)
kintastish
Сообщения: 2
Зарегистрирован: 2012.01.28, 18:23

Re: Использование Active Record с несколькими БД

Сообщение kintastish »

Доброго времени суток.
Сейчас делаю проект, в котором используются две базы данных - одна собственно разрабатываемого приложения db_A, другая стороннего приложения db_B. В db_B есть таблица Users. Для нее сделана по рецепту сделана модель.
Также в db_A есть таблица Message с вот таким отношением:

Код: Выделить всё

  'user_' => array(self::BELONGS_TO,  'Users',   'uid'), 
Однако при запросах вида

Код: Выделить всё

Message::model()->with('user_')->findAll() 
MySQL выдает ошибку доступа к db_B
SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user 'user1'@'localhost' for table 'users'
что в принципе понятно, т.к. у пользователя db_A нет прав на db_B и наоборот.
Возможно ли сделать так, чтобы код Message::model()->with('user_')->findAll() нормально работал без назначения прав на db_B?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование Active Record с несколькими БД

Сообщение samdark »

Нет, такой возможности нет. Юзер должен иметь права на обе базы.
kintastish
Сообщения: 2
Зарегистрирован: 2012.01.28, 18:23

Re: Использование Active Record с несколькими БД

Сообщение kintastish »

Получается только не "жадной" загрузкой вроде $msg->user_->name можно пользоваться?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование Active Record с несколькими БД

Сообщение samdark »

В вашем случае да. Это ограничение MySQL.
MrZaYaC
Сообщения: 58
Зарегистрирован: 2012.04.23, 10:17

Re: Использование Active Record с несколькими БД

Сообщение MrZaYaC »

А как в миграциях переключится на другую базу?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Использование Active Record с несколькими БД

Сообщение anton44eg »

$this->dbConnection = Yii::app()->db2;
xBazilio
Сообщения: 1
Зарегистрирован: 2013.04.11, 22:58

Re: Использование Active Record с несколькими БД

Сообщение xBazilio »

Можно я покритикую?

Когда-то при разработке одного приложения тимлид предложил делить некоторые вещи на разные БД.
Мы даже попробовали...

Мне понадобилось не много времени, чтобы объяснить об ошибочности выбора такого подхода и мы вернули все таблицы в одну БД.

Толку от этого ни какого нет, так как это всё работает только в пределах одного сервера БД и не даёт ни чего.
Прироста производительности нет.
Тимлид намекал на изоляцию одних данных от других. Но мы работаем с этими данными из одного скрипта, значит нет ни какой изоляции.
Всё это привносит только минус: все запросы обрастают префиксами имени БД.
brntsrs
Сообщения: 40
Зарегистрирован: 2012.07.16, 16:07

Re: Использование Active Record с несколькими БД

Сообщение brntsrs »

Тогда можно я расскажу плюс?

В своем проекте имеем очень большой объем личных сообщений, логов для админов и логов для пользователей. При этом работоспособность сервиса возможна и без этих данных (несмотря на то, что наличие этих данных - важная штука). Соотношение данных "логов" и "основных данных" - 95%\5%. Выделили логи в отдельную базу данных, включили префиксы к базам, написали дополнительную прослойку, которая позволяет переключаться с логовой базы на основную в случае отсутствия или косяка логовой.
Таким образом, при крахе системы, восстановление основной работы системы займет несколько минут, при этом новые данные будут сохраняться в основную базу (откуда потом скопируются в базу логов). А вот восстановление 10гб+ базы логов займет какое-то время, но это уже не важно.


А ежели вы хотите отделить важные данные от второстепенных жестким щитом - можно задуматься о двух проектах: хранилище данных с API + морда-сайт. Штука жуткая и сложная в поддержании (а в неумелых руках приведет к головной боли всех приближенных к проекту - прецеденты в работе есть), но способствует наличию целостности выполнения задач (нельзя получить кусок данных вместо выполнения полной операции внутри хранилища).
stop4uk
Сообщения: 159
Зарегистрирован: 2012.12.18, 07:08

Re: Использование Active Record с несколькими БД

Сообщение stop4uk »

Подниму тему и задам вопрос:
Есть два подключения db и db_user. Оба прописаны в соответствующих моделях

PageModel (Подключение db)

Код: Выделить всё

public function getDbConnection()
    {
        return Yii::app()->db;
    }
public function tableName()
    {
        return 'Page';
    }
 
UserModel (Подключение db_user соответственно)

Код: Выделить всё

public function getDbConnection()
    {
        return Yii::app()->db_user;
    }
        
public function tableName()
    {
        return Yii::app()->getModule('user')->tableUsers;
    }
 
Обе модели работают хорошо, а вот relations между ними нет...

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`) ...
Он почему-то ищет таблицу users не в той БД.. Что делать и как быть?

P.S. Подключения через конфиг одинаковые, разница только в названиях БД
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование Active Record с несколькими БД

Сообщение samdark »

Вы имена таблиц забыли префиксировать именем базы.
stop4uk
Сообщения: 159
Зарегистрирован: 2012.12.18, 07:08

Re: Использование Active Record с несколькими БД

Сообщение stop4uk »

Пробовал. Пишет, что таблица не найдена. Добавлял естесвенно в функции указания наименования таблицы
stop4uk
Сообщения: 159
Зарегистрирован: 2012.12.18, 07:08

Re: Использование Active Record с несколькими БД

Сообщение stop4uk »

Хелп...!!!!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Использование Active Record с несколькими БД

Сообщение samdark »

Возможно версия MySQL старенькая. Раньше оно так не умело.
Ответить