Как сделать запрос через базы данных с граалями? - PullRequest
2 голосов
/ 10 февраля 2010

Есть ли способ сделать запрос к 2 базам данных в Grails?

Пример (я сделал выборку по двум базам данных - работает и тестирует):

        select
            c.crf_name,
            c.crf_id,
            ig.group_id,
            ig.group_name,
        from
            works.crfs c,
            test.item_groups ig;

1) Я хотел бы сделать запрос к двум базам данных и прикрепить результаты к домену.

Или:

2) Можно ли смешивать одну часть запроса с данными из базы данных, а другую часть с классом домена?

Редактировать : мне нужно сделать один запрос, смешивая таблицы из 2 баз данных (одна база данных - PostgreSQL, а другая база данных - Mysql) Итак, можно ли смешивать в бинах данных источники данных в одном запросе?

Редактировать 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
;

Ответы [ 3 ]

3 голосов
/ 10 февраля 2010

Если вы планируете сделать свой собственный sql (как это, кажется, имеет место) для 2 источников данных, я предлагаю вам определить 2 источника данных как бины Spring в grails-app / conf / spring .

например. (поместите ваши драйверы БД в / lib и замените значения в соответствии с вашими драйверами СУБД и строкой подключения):

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, поэтому я не знаю, как вы хотите связать данные из ваших двух таблиц ...

Если вы хотите выполнить смешивание таблиц из двух баз данных в одном запросе (попросите своего администратора баз данных) установить DBLink между тестированием баз данных и работами и выполнить запрос к источнику данных, содержащему DBLink.

Надеюсь, это поможет.

0 голосов
/ 10 февраля 2010

Вы смотрели на плагин Источники данных ? Похоже, он будет делать то, что вам нужно, но я думаю, что вам нужно будет использовать HQL или средства поиска непосредственно для объектов домена, а не SQL, чтобы он работал.

Я не использовал плагин сам, но мне было бы интересно услышать, как оно работает, попробуйте.

НТН

0 голосов
/ 10 февраля 2010

Вы должны использовать «UNION SELECT», который поддерживается большинством баз данных. Убедитесь, что оба оператора select имеют одинаковое количество столбцов.

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

Выбор объединения объединяет результаты для 2 запросов, например:

select 1 union select 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...