Php 推进多数据库建模
我刚刚开始使用Propel,我很喜欢它,但是我有一个关于如何利用多个数据库连接的问题。我知道我可以在模式中设置连接到多个不同数据库的内容,但我很好奇如何在代码中处理这个问题 我遇到的问题是多个数据库,每个数据库都有稍微不同的模式,没有数据仓库。因此,我有以下类似的情况:Php 推进多数据库建模,php,database-design,model,propel,Php,Database Design,Model,Propel,我刚刚开始使用Propel,我很喜欢它,但是我有一个关于如何利用多个数据库连接的问题。我知道我可以在模式中设置连接到多个不同数据库的内容,但我很好奇如何在代码中处理这个问题 我遇到的问题是多个数据库,每个数据库都有稍微不同的模式,没有数据仓库。因此,我有以下类似的情况: databaseName: westCoastUsers table: users column1: email column2: password column3: FirstName databaseName: eastC
databaseName: westCoastUsers
table: users
column1: email
column2: password
column3: FirstName
databaseName: eastCoastUsers
table: users
column1: email
column2: password
column3: firstName
column4: lastName
现在在PHP非推进版本中,我手动完成所有这些操作,并根据需要手动切换数据库。我希望把事情简化一点,我很好奇如何建模。是否有一种方法可以让eastCoastUser和westCoastUser模型引用适当的数据库/etc,或者我是否试图插入不受支持的内容
我读过这篇文章:但我不确定如何在代码中实际执行它
感谢架构文件中的帮助,您可以为表示表的类提供名称。它们不必使用与表相同的名称。您可以使用table元素上的
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>
…这里的列。。。
...
…这里的列。。。
(编辑,请注意,database元素上的name=“westCoastUser”
指的是数据库的名称,而不是具有类似名称的类)
然后,在构建时,Prope将生成
Westcoast用户
,Westcoast用户查询
,Westcoast用户查询
,Eastcoast用户查询
和,Eastcoast用户查询
。每个类都将使用在模式中定义的数据库进行连接。我最初是为symfony 1.2编写的,但我相信它都适用
我在这个例子中使用symfony1.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
第一步
使用两个单独的连接创建databases.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:
_attributes:
package: lib.model.slave
defaultIdMethod: native
auctionp:
_attributes: { package: lib.model.slave }
等等
slave.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:
_attributes:
package: lib.model.slave
defaultIdMethod: native
auctionp:
_attributes: { package: lib.model.slave }
等等
步骤3
您需要创建单独的spreep.ini文件。在本例中,我使用了spreep-master.ini和spreep-slave.ini。这些文件中的每一个都需要为各自的数据库进行配置
步骤4
您需要一个好的批处理文件来使用推进工具构建数据库。我的看起来像这样:
从应用程序根目录:
symfony构建模型;cp配置/slave-spreep.ini配置/spreep.ini;symfony推进:构建sql;symfony推进:插入sql——无确认;cp配置/spreep-master.ini配置/spreep.ini;symfony推进:构建sql;symfony推进:插入sql——无确认
步骤5
如果您已经使用一个数据库构建了您的模型,并且现在正在进行拆分,则需要清除/lib/model。删除“map”和“om”目录以及根目录中的文件将有助于避免冲突
步骤6
要在代码中使用这两个数据库,需要向连接中添加一点,如下所示:
databaseName: westCoastUsers
table: users
column1: email
column2: password
column3: FirstName
databaseName: eastCoastUsers
table: users
column1: email
column2: password
column3: firstName
column4: lastName
例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();
你能解释一下你想如何使用这些数据吗?您希望使用
UserQuery
搜索这两个数据库吗?或者,你希望西海岸的网站用户搜索一个数据库,而东海岸的用户搜索另一个数据库吗?这看起来正是我想要/需要的。我将测试这些东西,并在本周末前发布/奖励。感谢Joeshmo的快速回复。