BigQuery - Simba JDBC 驱动程序 - 事务中不支持 DDL 语句

问题描述 投票:0回答:2

我使用 BigQuery 版本 1.2 的 Simba JDBC 驱动程序删除 BQ 中不存在的表,然后重新创建它。

但是从驱动程序1.3开始,引入了会话/事务的东西,导致它无法删除表并出现以下错误:

Transaction control statements are supported only in scripts or sessions

EnableSession=1
添加到连接字符串后,该错误消失了,但我猜 BQ 仍然不允许删除/创建永久资产,例如事务内的表。它因以下错误而失败:

{
  "code": 400,
  "errors": [
    {
      "domain": "global",
      "location": "q",
      "locationType": "parameter",
      "message": "DDL statements are not supported in a transaction, except for those creating or droping temporary tables or temporary functions.",
      "reason": "invalidQuery"
    }
  ],
  "message": "DDL statements are not supported in a transaction, except for those creating or droping temporary tables or temporary functions.",
  "status": "INVALID_ARGUMENT"
}

即使我的语句没有

transaction
命令,我怎样才能用这个新驱动程序达到同样的目标?

google-cloud-platform jdbc google-bigquery
2个回答
0
投票

这是 BigQuery 的限制。只能以事务方式创建/删除临时表

也许在事务之外使用“创建或替换表”ddl 可以适合您的用例


0
投票

正如 @ms4446 的评论中提到的,要使用 Simba JDBC 驱动程序 1.3 在 BigQuery 中删除和创建表,由于 BigQuery 的限制,您应该避免在永久表上使用事务进行 DDL 操作。相反,单独执行 DROP 和 CREATE 语句,而不将它们包装在事务中。

这是一个 Java 示例:

`导入java.sql.*;

公共类 DropAndCreateTable {

public static void main(String[] args) 抛出异常 {

// Create a new connection to BigQuery.
String connectionString = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=YourProjectId;OAuthType=0;";
Connection connection = DriverManager.getConnection(connectionString);




// Drop the table (if it exists).
Statement statement = connection.createStatement();
statement.execute("DROP TABLE IF EXISTS my_dataset.my_table");




// Create the table.
statement.execute("CREATE TABLE my_dataset.my_table (id INT64, name STRING)");




// Close the connection.
connection.close();

}

}’

如果需要使用事务,请考虑使用临时表。要在 BigQuery 中创建临时表,请使用:

CREATE TEMPORARY TABLE temp\_table\_name (id INT64, name STRING);

临时表是会话范围的,将在会话结束时自动删除。

将答案发布为社区 wiki,以造福于将来可能遇到此用例的社区。请随意编辑此答案以获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.