динамически установить БД в запросе SQL - PullRequest
3 голосов
/ 15 февраля 2010

Я пытаюсь запустить один и тот же запрос в несколько БД в MySQL:

def m='xxx'
def dbs =  ['DB05DEC05','DB06DEC06','DB07DEC07','DB08DEC08','DB09DEC09','DB10DEC10']
def sql =Sql.newInstance("jdbc:mysql://localhost:3306", "root","", "org.gjt.mm.mysql.Driver")
dbs.each{
 db-> sql.eachRow("select * from ${db}.mail where mid=$m", { println "\t$db ${it.mid}"} );
}

Это выдает ошибку:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''DBJAN05DEC05'.mail where mid='xxx'

Groovy, по-видимому, выполняет некоторые пользовательские операции с кавычками и просит не использовать кавычки в sql (обратите внимание на mid = $ m, если вы используете mid = '$ m', это предупреждает вас об использовании кавычек). Проблема в том, что в первом $ я вообще не знаю, хотите ли вы кавычки, проблема в кавычках ...

заводная 1,7 на перспективу. спасибо

редактирование: я нашел похожий вопрос, но он также не имеет принятого ответа ... Groovy GString проблемы

1 Ответ

7 голосов
/ 16 февраля 2010

Проблема в том, что метод SQL-запроса видит GString со встроенными ссылками на переменные и превращает каждую ссылку в? в подготовленном заявлении.

Итак:

sql.query("select * from table where col = ${value}")

... эквивалентно:

sql.query("select * from table where col = ?", [ value ])

Но также:

sql.query("select * from ${db}.table where col = ${value}")

эквивалентно:

sql.query("select * from ?.table where col = ?", [ db, value ])

... что не удается на уровне БД, поскольку оператор выбора недопустим.

Очевидный обходной путь - использовать явно подготовленную версию оператора запроса ().

dbs.each{ db-> 
    sql.eachRow("select * from ${db}.mail where mid=?", m, { 
       println "\t$db ${it.mid}"
    });
}

Однако класс Sql предоставляет вам метод expand (), который, похоже, предназначен для этой цели.

dbs.each{ db -> 
   sql.eachRow(
      "select * from ${Sql.expand(db)}.mail where mid=${m}", 
      { println "\t$db ${it.mid}"} );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...