Я только начал работать с 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, но я не уверен, как реально выполнить это в коде.
Спасибо за помощь
В файлах схемы вы можете указать имя для класса, представляющего вашу таблицу. Они не должны использовать то же имя, что и таблица. Вы делаете это с атрибутом 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();