Использование нескольких баз данных

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Использование нескольких баз данных

Сообщение Одиночка Айс »

Читал DAO (путь просвещения, млин). Итак, как заставить Yii работать с несколькими БД? Что-то вроде этого:

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

    $connection=new CDbConnection('polls','root','');
    $sql="SELECT id FROM options WHERE ques_id='1'";
    $command=Yii::app()->db->createCommand($sql);
    $dataReader=$command->query();
 
???

Получаю ошибку: CDbCommand failed to execute the SQL statement: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'idkaznet.options' doesn't exist

То есть Yii считает, что новой БД как бы не выбрано. Вобщем, вопроса два:

1. Как заюзать вторую БД?
2. Как после этого писать запросы без использования прямых SQL-запросов (то есть в стиле Yii)? Создавать модели???
Ни любви, ни тоски, ни жалости...
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Использование нескольких баз данных

Сообщение BuCeFaL »

Одиночка Айс писал(а):Читал DAO (путь просвещения, млин). Итак, как заставить Yii работать с несколькими БД? Что-то вроде этого:

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

    $connection=new CDbConnection('polls','root','');
    $sql="SELECT id FROM options WHERE ques_id='1'";
    $command=Yii::app()->db->createCommand($sql);
    $dataReader=$command->query();
 
???

Получаю ошибку: CDbCommand failed to execute the SQL statement: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'idkaznet.options' doesn't exist

То есть Yii считает, что новой БД как бы не выбрано. Вобщем, вопроса два:

1. Как заюзать вторую БД?
2. Как после этого писать запросы без использования прямых SQL-запросов (то есть в стиле Yii)? Создавать модели???

конструктор, первый параметр:
Формат DSN зависит от используемого драйвера PDO. Как правило, DSN состоит из имени драйвера PDO, за которым следует двоеточие, а далее указываются параметры подключения, соответствующие синтаксису подключения используемого драйвера. Подробнее с этим можно ознакомиться в документации по PDO. Ниже представлены несколько основных форматов DSN:

* SQLite: sqlite:/path/to/dbfile
* MySQL: mysql:host=localhost;dbname=testdb
* PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
* SQL Server: mssql:host=localhost;dbname=testdb
* Oracle: oci:dbname=//localhost:1521/testdb
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Re: Использование нескольких баз данных

Сообщение Одиночка Айс »

Это к чему было вообще? Вы предлагаете мне заюзать второй main.php, чтобы получить 5 последних тем с форума? Не слишком жестоко?
Ни любви, ни тоски, ни жалости...
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Использование нескольких баз данных

Сообщение BuCeFaL »

нет, я предлагаю определить в конфиге 2-й компонент с 2-м соеденением, а в AR переопределить http://www.yiiframework.com/doc/api/CAc ... #db-detail db на 2-ю бд.
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Использование нескольких баз данных

Сообщение Caveman »

Одиночка Айс писал(а):

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

    $connection=new CDbConnection('polls','root','');
    $sql="SELECT id FROM options WHERE ques_id='1'";
    $command=Yii::app()->db->createCommand($sql);
    $dataReader=$command->query();
 
Yii::app()->db - это ссылка на соединение БД по умолчанию, то, настройки которого обычно прописаны в конфиге main.php.
Вы создаете новое соединение, но запрос выполняете в старом. Естественно таблица не будет найдена.

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

    $connection=new CDbConnection('polls','root',''); // новое соединение
    $sql="SELECT id FROM options WHERE ques_id='1'";
    $command = $connection->createCommand($sql); // создаем команду в новом соединении
    $dataReader=$command->query(); // читаем
 
А можно в конфиге добавить второе соединение:

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

...
'db2' => array(
...
)
... 
и использовать его - Yii::app()->db2
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Использование нескольких баз данных

Сообщение slavcodev »

Еще можно заглядывать в документацию и рецепты
http://yiiframework.ru/doc/cookbook/ru/ ... .databases
Жду Yii 3!
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Re: Использование нескольких баз данных

Сообщение Одиночка Айс »

Caveman писал(а): А можно в конфиге добавить второе соединение:

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

...
'db2' => array(
...
)
... 
и использовать его - Yii::app()->db2
А вот за это спасибо, как то сразу не догадался ))))
Ни любви, ни тоски, ни жалости...
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Re: Использование нескольких баз данных

Сообщение Одиночка Айс »

Нашел вот тут решение переопределения класса. Теперь вопрос: почему мы должны явно указывать Yii, что собираемся работать с классом CDbConnection???
Ни любви, ни тоски, ни жалости...
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: Использование нескольких баз данных

Сообщение Ryadnov »

Компонент 'db' является частью ядра YII
и в CApplication::registerCoreComponents()
прописано

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

            'db'=>array(
                'class'=>'CDbConnection',
            ), 
и в конфиге вы лишь прописываете его свойства

а "secondbd" вы создате, поэтому обязательно нужно указать класс
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Re: Использование нескольких баз данных

Сообщение Одиночка Айс »

Теперь понятно, спасибо )))
Ни любви, ни тоски, ни жалости...
Аватара пользователя
rem
Сообщения: 56
Зарегистрирован: 2011.11.22, 16:08

Re: Использование нескольких баз данных

Сообщение rem »

Посмотрел рецепт, который давали выше. Там в примере написано:

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

// возвращаем имя таблицы вместе с именем БД
    public function tableName(){
         return 'db2.comment';
    }
А как можно узнать имя базы данных (из конфигов) чтобы подставить в строке "return 'db2.comment';" переменную с этим именем вместо "db2"? Просто у меня приложение работает еще с другими базами и они называются у всех по-разному.
Jampire
Сообщения: 207
Зарегистрирован: 2011.01.28, 11:45
Откуда: Гомель
Контактная информация:

Re: Использование нескольких баз данных

Сообщение Jampire »

rem писал(а):Посмотрел рецепт, который давали выше. Там в примере написано:

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

// возвращаем имя таблицы вместе с именем БД
    public function tableName(){
         return 'db2.comment';
    }
А как можно узнать имя базы данных (из конфигов) чтобы подставить в строке "return 'db2.comment';" переменную с этим именем вместо "db2"? Просто у меня приложение работает еще с другими базами и они называются у всех по-разному.

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

public function tableName() {
            $connectionString = Yii::app()->db->connectionString;
            preg_match('/dbname=(\w+)/', $connectionString, $matches);
            return $matches[1] . '.comment';
} 
Изображение
Человек, говорящий, что это невозможно сделать, не должен мешать тому, кто это делает.
Аватара пользователя
rem
Сообщения: 56
Зарегистрирован: 2011.11.22, 16:08

Re: Использование нескольких баз данных

Сообщение rem »

Спасибо.

Так, помучился и теперь такая проблема. Никак не могу правильно составить реляционный запрос с WHERE из 2х баз.
Вот пример запроса со старого фреймворка:

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

$query = $db2->query("SELECT users.id, users.name, accounts.access_level FROM users INNER JOIN $db3.accounts ON users.acc_id = $db3.accounts.id WHERE $db3.accounts.access_level > 0 AND users.status = 1");
Может есть у кого-нибудь пример с WHERE для 2х таблиц?

Пробовал с этим примером, но возвращается пустой массив:

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

$users=User::model()->with(array(
    'posts'=>array(
        // записи нам не нужны
        'select'=>false,
        // но нужно выбрать только пользователей с опубликованными записями
        'joinType'=>'INNER JOIN',
        'condition'=>'posts.published=1',
    ),
))->findAll(); 
Аватара пользователя
rem
Сообщения: 56
Зарегистрирован: 2011.11.22, 16:08

Re: Использование нескольких баз данных

Сообщение rem »

Все разобрался. Просто поменял базы местами, то есть брал таблицу с акками и по ней искал нужных пользователей.
mess@nger
Сообщения: 54
Зарегистрирован: 2012.06.25, 14:32
Откуда: Житомир

Re: Использование нескольких баз данных

Сообщение mess@nger »

День добрый,
Не могу понять, что делаю не так

main.php:

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

        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString' => 'mysql:host=localhost;dbname=base1',
            'emulatePrepare' => true,
            'username' => '***',
            'password' => '***',
            'charset' => 'utf8',
        ),
        'db2'=>array(
            'connectionString' => 'firebird:dbname=path_to_base2;charset=utf8',
            'class' => 'ext.YiiFirebird.CFirebirdConnection',
            'username' => '***',
            'password' => '***',
            'charset' => 'utf8',
        ),
 
mysql- база работает норм,
для firebird прописана одна модель которая содержит примерно слежующие ф-ции

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

public static function getSomeInfo($param1,$param2){
        $info =0
            Yii::app()->db2->createCommand()->...
            ->queryAll();
            return $info;
}
пока проверял SQL-запросы и firebird-база это было db - было все ок, но когда добавил mysql и сменил на db2 получил ошибку:

CDbCommand failed to execute the SQL statement: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'base1....

то есть, обращение идет к db, а не db2
mess@nger
Сообщения: 54
Зарегистрирован: 2012.06.25, 14:32
Откуда: Житомир

Re: Использование нескольких баз данных

Сообщение mess@nger »

боже, я идиот =((((

я для теста вызывал запрос в контроллере... и забыл об этом, и там не поменяно db на db2
Ответить