Cassandra/Java 不匹配的字符 创建以 MD5 作为名称的表时出现异常



我正在设置一个Cassandra数据库,并尝试使用MD5哈希代码作为表名创建表。 当我这样做时,我得到了一个com.datastax.oss.driver.api.core.servererrors.SyntaxError: line 1:35 mismatched character '2' expecting '-'异常。

我的查询:

CREATE TABLE IF NOT EXISTS 77f2d6b127b7d4a89a940d0829ff1e672afb4362_status (
jsonSchema TEXT,
onlineStatus INT,
key text,
timestamp timeuuid,
primary key(key, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC) 
AND compaction = {'class': 'TimeWindowCompactionStrategy', 
'compaction_window_size': 1, 
'compaction_window_unit': 'DAYS'};

例外情况:

Caused by: com.datastax.oss.driver.api.core.servererrors.SyntaxError: line 1:35 mismatched character '2' expecting '-'
at com.datastax.oss.driver.api.core.servererrors.SyntaxError.copy(SyntaxError.java:48)
at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:113)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:53)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:30)
at com.datastax.oss.driver.internal.core.session.DefaultSession.execute(DefaultSession.java:207)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:47)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:56)

我想知道为什么会这样。根据 https://docs.datastax.com/en/archived/cql/3.3/cql/cql_reference/ref-lexical-valid-chars.html 查询应具有正确的语法。

我试过什么

双引号

当我将表名放在双引号(CREATE TABLE IF NOT EXISTS "77f2d6b127b7d4a89a940d0829ff1e672afb4362_status" (...)中时,它可以工作,但随后我的 IntelliJ 数据库 IDE 出现问题,因为它不使用双引号查询数据库作为表名。

以字母 ([a-z]) 开头的表名

当我手动在表名前面添加一个字母(不是数字;例如a77f2d6b127b7d4a89a940d0829ff1e672afb4362_status),表已创建,但我收到另一个超时异常:

com.datastax.oss.driver.api.core.DriverTimeoutException: Query timed out after PT2S
at com.datastax.oss.driver.api.core.DriverTimeoutException.copy(DriverTimeoutException.java:34)
at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:113)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:53)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:30)
at com.datastax.oss.driver.internal.core.session.DefaultSession.execute(DefaultSession.java:207)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:47)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:56)

超时异常后,我可以再次执行相同的查询。这次没有错误 ->表已成功创建。


我使用以下Java驱动程序:[Maven: com.datastax.oss:java-driver-core:4.0.1]

任何帮助都非常受欢迎。

我认为文档不正确 - 它应该说:

以字母字符开头,包含字母数字,...

我还没有在 CQL 的语法中找到表/键空间名称的这个定义(仅适用于列名),但它在 cqlsh 代码中可见。

  1. 在 CQL 语法中,表名的规则称为cfName。如您所见,表名可以是非引号标识符(IDENT),带引号的名称(QUOTED_NAME)或非保留关键字。此处定义了IDENT规则。如您所见,它需要以字母开头。要创建一个像你这样命名的表,你需要用它加双引号(我尝试过使用 CQLSH,它有效 - 抱歉,如果 IntelliJ 无法理解这一点)。
  2. 默认情况下,CQL 查询的驱动程序超时为 2 秒。对于 DDL 查询,这通常是不够的。您可以提高单个查询的超时,如下所示:
session.execute( SimpleStatement.newInstance( "如果不存在,则创建表...") .setTimeout(Duration.ofSeconds(30)));

相关内容

  • 没有找到相关文章

最新更新