使用groovy sql迁移数据库表时遇到问题

发布于 2025-01-01 13:38:55 字数 717 浏览 2 评论 0原文

我想使用不同的sql连接从一个表中选择数据并批量插入到另一个表中。两张表的设置完全相同。目前我有:

destination.withBatch(1000) { stmt ->

    source.eachRow(selectQuery) {

        String insertString = """
                    INSERT INTO dest_table
                    VALUES (
                          ${it[0]},
                          ${it[1]});
                    """

        try {
            stmt.addBatch(insertString)
        }
        catch (Exception e) {
            println insertString
        }
    }
}

在此过程中的数据类型似乎发生了一些事情,因为由于冒号而插入像 'a:string' 这样的字符串非常不高兴。

我可以执行 '${it[0]}' 来强制将其视为字符串,但是当我使用其他数据类型时,这会导致问题。

此外,我的错误处理肯定无法正常工作。我希望它打印出它无法执行的插入,然后优雅地继续。

谢谢

I want to select data from one table and insert into another in batches, using different sql connections. The two tables are set up exactly the same. At the moment I have:

destination.withBatch(1000) { stmt ->

    source.eachRow(selectQuery) {

        String insertString = """
                    INSERT INTO dest_table
                    VALUES (
                          ${it[0]},
                          ${it[1]});
                    """

        try {
            stmt.addBatch(insertString)
        }
        catch (Exception e) {
            println insertString
        }
    }
}

Something seems to happen to the data types in this process, because it gets very unhappy inserting a string like 'a:string' because of the colon.

I could do '${it[0]}' to enforce it is treated as a String, but this will cause problems when I come to other data types.

Furthermore, my error handling is definitely not working correctly. I want it to print out the inserts that it was unable to execute, and then carry on gracefully.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你的背包 2025-01-08 13:38:55

groovy sql 很可能正在从您的 sql 字符串创建一个准备好的语句,并且其中带有冒号的任何内容都会被解析为参数占位符。

因此,我建议顺应流程,单独绑定数据值,而不是将它们内联到 sql 语句中。这也可能会提高性能,因为准备好的语句可以由数据库缓存。

It's likely that groovy sql is creating a prepared statement from your sql string, and that anything with a colon in it is parsed as a parameter placeholder.

So, I'd suggest going with the flow, and binding your data values separately, instead of putting them inline in the sql statement. This will also probably improve performance, as the prepared statements can be cached by the database.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文