gpt4 book ai didi

sql - 在sql查询中动态设置数据库

转载 作者:行者123 更新时间:2023-12-04 14:17:09 25 4
gpt4 key购买 nike

我尝试在 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',它会警告您不要使用引号)。问题是在第一个 $ 我根本不知道要引号,引号是问题...

vista 上的 groovy 1.7。谢谢

编辑:我发现了一个类似的问题,但也没有公认的答案... Groovy GString issues

最佳答案

问题是 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 ])

...由于 select 语句无效而在 DB 层失败。

明显的解决方法是使用 query() 的显式准备语句版本。

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

关于sql - 在sql查询中动态设置数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2267756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com