23

有没有一种简单的方法来检查表(列族)是否在 Cassandra 中使用 CQL(或 API,可能使用 com.datastax.driver)定义?

现在我倾向于执行SELECT 1 FROM table和检查异常,但也许有更好的方法?

4

4 回答 4

26

从 1.1 开始,您应该能够查询system键空间、schema_columnfamilies列族。如果您知道要检查哪个键空间,则此 CQL 应列出键空间中的所有列族:

SELECT columnfamily_name
FROM schema_columnfamilies WHERE keyspace_name='myKeyspaceName';

描述此功能的报告在这里:https ://issues.apache.org/jira/browse/CASSANDRA-2477

虽然,他们确实注意到一些系统列名在 1.1 和 1.2 之间发生了变化。因此,您可能不得不对其进行一些处理才能获得所需的结果。

编辑 20160523 - Cassandra 3.x 更新:

请注意,对于 Cassandra 3.0 及更高版本,您需要对上述查询进行一些调整:

SELECT table_name 
FROM system_schema.tables WHERE keyspace_name='myKeyspaceName';
于 2013-04-15T14:52:01.613 回答
21

Java 驱动程序(因为您在问题中提到它)还维护模式的本地表示。

驱动程序 3.x 及以下:

KeyspaceMetadata ks = cluster.getMetadata().getKeyspace("myKeyspace");
TableMetadata table = ks.getTable("myTable");
boolean tableExists = (table != null);

驱动程序 4.x 及更高版本:

Metadata metadata = session.getMetadata();
boolean tableExists =
  metadata.getKeyspace("myKeyspace")
    .flatMap(ks -> ks.getTable("myTable"))
    .isPresent();
于 2015-07-16T12:27:37.167 回答
5

我只需要使用 cqlsh 手动检查表是否存在。可能有用的一般信息。

describe keyspace_name.table_name

如果它不存在,你会得到'table_name' not found in keyspace 'keyspace' 如果它确实存在,你会得到表的描述。

于 2015-10-02T00:35:16.243 回答
0

对于 .NET 驱动程序CassandraCSharpDriver版本 3.17.1,如果表尚不存在,则以下代码会创建一个表:

var ks = _cassandraSession.Cluster.Metadata.GetKeyspace(keyspaceName);
var tableNames = ks.GetTablesNames();
if(!tableNames.Contains(tableName.ToLowerInvariant()))
{
   var stmt = new SimpleStatement($"CREATE TABLE {tableName} (id text PRIMARY KEY, name text, price decimal, volume int, time timestamp)");
   _cassandraSession.Execute(stmt);
}

您需要根据需要调整表格列的列表。这也可以通过使用await _cassandraSession.ExecuteAsync(stmt).ConfigureAwait(false)异步方法来等待。

另外,我想提一下我使用的是 Cassandra 4.0.1 版。

于 2021-12-28T00:53:29.893 回答