有没有办法查询grails中的2个数据库?
示例(我对两个数据库进行了选择 - 工作和测试):
select
c.crf_name,
c.crf_id,
ig.group_id,
ig.group_name,
from
works.crfs c,
test.item_groups ig;
1)我想查询两个数据库,并将结果附加到域。
或者:
2)是否可以将一个查询部分与来自数据库的数据混合,将其他部分与域类混合?
编辑:我需要进行单个查询,混合来自2个数据库的表(一个db是PostgreSQL,其他db是Mysql)。那么,在grails中是否可以在一个查询中混合使用dataSources bean?
编辑2:这是一个更好的例子:
select
igm.item_id,
igm.item_group_id as group_id,
igm.crf_version_id,
ig.name as group_name
from
works.item_group_metadata igm,
test.item_group ig
where
igm.item_group_id=ig.item_group_id
;
答案 0 :(得分:3)
如果你计划在{2}数据源上to do your own sql(似乎就是这种情况),我建议你在grails-app / conf / spring中将你的2个数据源定义为Spring bean。
e.g。 (将数据库驱动程序放入/ lib并替换值以匹配RDBMS驱动程序和连接字符串):
import org.apache.commons.dbcp.BasicDataSource
import oracle.jdbc.driver.OracleDriver
beans = {
worksDataSource(BasicDataSource) {
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@someserver:someport:works"
username = "works"
password = "workspassword"
}
testDataSource(BasicDataSource) {
driverClassName = "oracle.jdbc.driver.OracleDriver"
url = "jdbc:oracle:thin:@someserver:someport:test"
username = "test"
password = "testpassword"
}
}
然后创建一个服务来处理您的查询,例如:
import groovy.sql.Sql
class SomeService {
def worksDataSource
def testDataSource
def query1 = """
SELECT crf_name, crf_id
FROM works.crfs
"""
def query2 = """
SELECT group_id, group_name
FROM test.item_groups
"""
def sqlWorks = Sql.newInstance(query1)
def sqlTest = Sql.newInstance(query2)
// Then do whatever you like with the results of the 2 queries
// e.g.
sqlWorks.eachRow{ row ->
def someDomainObject = new SomeDomainObject(prop1 : row.crf_name, prop2 : crf_id)
someDomainObject.otherProp = whateverYouLike()
someDomainObject.save()
}
}
您的查询没有where子句,因此我不知道您希望如何关联来自2个表的数据......
如果要进行单个查询混合来自2个数据库的表,(请求您的DBA)在数据库之间建立DBLink测试和工作,并对包含DBLink的数据源执行查询。
我希望这会有所帮助。
答案 1 :(得分:0)
您应该使用大多数数据库支持的“UNION SELECT”。确保两个select语句具有相同的列数。
select
crf_name,
crf_id
from
ig
UNION SELECT
group_id,
group_name
from
id
联合选择连接2个查询的结果,例如:
select 1 union select 2
答案 2 :(得分:0)
你看过Datasources plugin了吗?听起来它会做你需要的,但我认为你需要直接在域对象上使用HQL或finder,而不是SQL,才能使它工作。
我自己没有使用过该插件,但我很想知道它是怎么回事。
HTH