2010-02-10 9 views
2

Existe-t-il un moyen d'interroger deux bases de données dans Grails?Comment interroger des bases de données avec des grails?

Exemple (j'ai fait une sélection sur deux bases de données - travaux et essais):

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

1) Je voudrais interroger sur deux bases de données, et joindre les résultats à un domaine.

Ou:

2) Est-il possible de mélanger une partie de la requête avec les données de base de données et d'autre part à la classe de domaine?

Édition: J'ai besoin de faire une seule requête en mélangeant les tables de 2 bases de données (une DB est PostgreSQL et l'autre DB est Mysql). Donc, dans grails est-il possible de mélanger aux beans dataSources dans une requête?

Edit 2: Voici un meilleur exemple:

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 
; 

Répondre

3

Si vous prévoyez to do your own sql (comme il semble être le cas) sur 2 sources de données, je vous suggère de définir vos 2 sources de données comme les haricots de printemps dans Grails-app/conf/printemps.

par exemple. (Déposez vos pilotes db dans/lib et remplacez les valeurs en fonction de vos pilotes SGBDR et chaîne de connexion):

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" 
    } 
} 

Ensuite, créez un service pour gérer vos requêtes, comme:

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() 
    }  
} 

Votre requête doesn N'avez pas une clause where, donc je ne sais pas comment vous voulez relier les données provenant de vos 2 tables ...

Si vous voulez faire une seule requête de tables de mixage à partir de 2 bases de données, (demandez à votre DBA de) établir un DBLink entre les bases de données test et travaille et effectuer la requête sur le datasourc e contenant le DBLink.

J'espère que cette aide.

+0

Oui, je veux faire une seule requête de tables de mixage à partir de 2 bases de données. Je voudrais mélanger sqlWorks et sqlTest dans une requête. Je suppose qu'il n'est pas possible d'ajouter sqlTest dans ma fermeture de sqlWorks? Merci. –

+0

C'est possible, mais je pense qu'il y a un problème dans la requête que vous avez posté: Je ne vois pas comment vous joignez vos 2 tables sans clause where ... De plus, quels SGBDR utilisez-vous pour vos 2 bases de données? Faites-vous tout seul ou travaillez-vous avec un DBA? – Philippe

+0

J'utilise postgreSQL et Mysql. Et je fais tout seul. Vous avez raison, ma requête n'était pas bonne pour cet exemple, je vais éditer une nouvelle requête. Si possible, pouvez-vous me montrer un exemple en grails avec ma nouvelle requête? Merci. –

0

Vous devez utiliser une "UNION SELECT" qui est pris en charge par la plupart des bases de données. Assurez-vous que les deux instructions select ont le même nombre de colonnes.

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

Une union select concatène les résultats pour 2 requêtes, par exemple:

select 1 union select 2 
+0

Pouvez-vous me montrer un exemple? Comment utiliser UNION avec sqlconnector.eachRow ('' 'select ...' '')? Où je définis mes deux dataSource avec des grails? –

+0

Idk man, si vous ne pouvez pas obtenir une rangée, alors vous devriez prendre quelques pas en arrière et commencer avec les bases mêmes de sql. – rook

+0

Mon problème est plus complexe, car j'ai besoin de faire une seule requête en mélangeant les tables de 2 bases de données (une DB est PostgreSQL et l'autre DB est Mysql). Je vais éditer ma question. –

0

Avez-vous regardé le Datasources plugin? Il semble que vous fassiez ce dont vous avez besoin, mais je pense que vous devez utiliser directement HQL ou finders sur les objets de domaine, plutôt que sur SQL, pour que cela fonctionne.

Je n'ai pas utilisé le plugin moi-même, mais je serais intéressé d'entendre comment ça se passe, vous l'essayez.

HTH

+0

Ce plugin semble très intéressant, je vais essayer l'exemple de l'application de test ... Merci. –

Questions connexes