【问题标题】:How to querying across databases with grails?如何使用 grails 跨数据库查询?
【发布时间】:2010-02-10 00:14:49
【问题描述】:

有没有办法在 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
;

【问题讨论】:

    标签: grails groovy orm


    【解决方案1】:

    如果您计划to do your own sql(似乎是这样)超过 2 个数据源,我建议您将 2 个数据源定义为 grails-app/conf/spring 中的 Spring bean。

    例如(将您的数据库驱动程序放在 /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 的数据源上执行查询。

    我希望这会有所帮助。

    【讨论】:

    • 是的,我想做一个查询混合来自 2 个数据库的表。我想在一个查询中混合使用 sqlWorks 和 sqlTest。我想,不可能在我的 sqlWorks 闭包中添加 sqlTest 吗?谢谢。
    • 有可能,但我认为您发布的查询存在问题:我看不到您如何在没有 where 子句的情况下加入 2 个表...另外,您使用的是什么 RDBMS为您的 2 个数据库?您是自己做所有事情还是与 DBA 一起工作?
    • 我正在使用 postgreSQL 和 Mysql。而我自己做的一切。没错,我的查询不适用于此示例,我将编辑一个新查询。如果可能的话,您能否在我的新查询中向我展示 grails 中的示例?谢谢。
    【解决方案2】:

    您应该使用大多数数据库都支持的“UNION SELECT”。确保两个 select 语句具有相同的列数。

        select
            crf_name,
            crf_id
        from
            ig
        UNION SELECT
            group_id,
            group_name
        from
            id
    

    联合选择将 2 个查询的结果连接起来,例如:

    select 1 union select 2
    

    【讨论】:

    • 你能给我举个例子吗?如何将 UNION 与 sqlconnector.eachRow('''select...''') 一起使用?我在哪里用 grails 定义我的两个数据源?
    • Idk 伙计,如果你无法获得一行,那么你应该退后几步,从最基础的 sql 开始。
    • 我的问题更复杂,因为我需要做一个查询混合来自 2 个数据库的表(一个 db 是 PostgreSQL,另一个 db 是 Mysql)。我将编辑我的问题。
    【解决方案3】:

    你看过Datasources plugin吗?听起来它会满足您的要求,但我认为您需要直接在域对象上使用 HQL 或查找器,而不是 SQL,才能使其工作。

    我自己没有使用过这个插件,但我很想知道它是如何使用的,你试试吧。

    HTH

    【讨论】:

    • 这个插件看起来很有趣,我会尝试测试应用示例...谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多