Моделирование нескольких базовых баз данных

Я только начал работать с Propel, и мне это нравится, но у меня есть вопрос, как использовать несколько соединений с базой данных. Я знаю, что могу установить в моей схеме все, чтобы подключиться к нескольким различным базам данных, но мне любопытно, как обращаться с этим в коде.

У меня есть несколько баз данных, и у каждого из них есть несколько разные схемы без хранилища данных. В результате у меня есть вещи, напоминающие следующее:

databaseName: westCoastUsers table: users column1: email column2: password column3: FirstName databaseName: eastCoastUsers table: users column1: email column2: password column3: firstName column4: lastName 

Прямо сейчас в PHP-версии, отличной от Propel, я делаю все это вручную и вручную переключая базы данных по мере необходимости. Я надеюсь немного упорядочить вещи, и мне любопытно, как это моделировать. Есть ли способ, которым я могу просто иметь что-то вроде моделей eastCoastUser и westCoastUser, каждый из которых относится к соответствующей базе данных / etc или я пытаюсь вклиниться в что-то, что не поддерживается?

Я читал это: как использовать две базы данных в propel, но я не уверен, как реально выполнить это в коде.

Спасибо за помощь

Related of "Моделирование нескольких базовых баз данных"

В файлах схемы вы можете указать имя для класса, представляющего вашу таблицу. Они не должны использовать то же имя, что и таблица. Вы делаете это с атрибутом phpName в элементе таблицы.

Например, ваш schema.xml может содержать что-то вроде этого

 <database name="westCoastUsers"> <table name="users" phpName="WestCoastUser"> ...columns here... </table> ... </database> <database name="eastCoastUsers"> <table name="users" phpName="EastCoastUser"> ...columns here... </table> </database> 

(отредактируйте, обратите внимание, что name="westCoastUser" в элементе базы данных относится к имени базы данных, а не к классам с похожими именами)

Затем во время сборки WestCoastUser будет генерировать WestCoastUser , WestCoastUserQuery , WestCoastUserPeer , EastCoastUser , EastCoastUserQuery и EastCoastUserPeer . Каждый класс будет подключаться, используя базу данных, определенную в вашей схеме.

Я написал это первоначально для symfony 1.2, но я считаю, что все это применимо.

Я использую Symfony 1.2.4 для этого примера. У меня есть две базы данных: master и slave

Если вы собираетесь использовать несколько баз данных, вам нужно будет кое-что сделать.

 You will need separate schema files for both (master.schema.yml and slave.schema.yml) To use build-sql and insert-sql, you will need multiple propel.ini files You will need to add an attribute to your schema files to get them to build right 

Шаг 1

Создайте database.yml с двумя отдельными соединениями:

 dev: propel: param: classname: DebugPDO test: propel: param: classname: DebugPDO all: propel: class: sfPropelDatabase param: classname: PropelPDO dsn: mysql:dbname=master;host=xxx.xxx.xxx.xxx username: uname password: pass encoding: utf8 persistent: true pooling: true master: class: sfPropelDatabase param: classname: PropelPDO dsn: mysql:dbname=slave;host=xxx.xxx.xxx.xxx username: uname password: pass encoding: utf8 persistent: true pooling: true 

Шаг 2

Как уже упоминалось, вам понадобятся два файла схемы. Обратите внимание, что вам нужно будет определить атрибут пакета для базы данных, который соответствует таблицам, и в этом случае это «lib.model.master» для основного соединения.

master.schema.yml

 master: _attributes: package: lib.model.master defaultIdMethod: native my_table: _attributes: { package: lib.model.master } my_id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true } 

и т.д…..

slave.schema.yml

 slave: _attributes: package: lib.model.slave defaultIdMethod: native auctionp: _attributes: { package: lib.model.slave } 

и т.д…..

Шаг 3

Вам нужно будет создать отдельные файлы propel.ini. В этом примере я использовал propel-master.ini и propel-slave.ini. Каждый из этих файлов должен быть настроен для соответствующих баз данных.

Шаг 4

Вам понадобится хороший командный файл для создания ваших баз данных с помощью инструментов перемещения. Моя выглядит так:

Из корня приложения: symfony build-model; cp config / slave-propel.ini config / propel.ini; symfony propel: build-sql; symfony propel: insert-sql –no-confirm; cp config / propel-master.ini config / propel.ini; symfony propel: build-sql; symfony propel: insert-sql –no-confirm;

Шаг 5

Вам нужно будет очистить / lib / model, если вы уже создали свою модель с использованием одной базы данных и теперь выполняете разделение. Удаление файлов в каталогах «map» и «om» и корневой каталог помогут избежать конфликтов.

Шаг 6

Чтобы использовать две базы данных в коде, вам нужно добавить бит к соединению, например:

Пример 1:

 $object = self::doSelect($c, Propel::getConnection('master')); 

Пример 2:

 $newObject->save(Propel::getConnection('slave')); 

Пример 3:

 $con = Propel::getConnection("propel"); $sql = "ALTER TABLE runlinhp CHANGE class class_rat varchar(15)"; $stmt = $con->prepare($sql); $stmt->execute();