有没有一种简单的方法来检查表(列族)是否在 Cassandra 中使用 CQL(或 API,可能使用 com.datastax.driver)定义?
现在我倾向于执行SELECT 1 FROM table
和检查异常,但也许有更好的方法?
从 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';
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();
我只需要使用 cqlsh 手动检查表是否存在。可能有用的一般信息。
describe keyspace_name.table_name
如果它不存在,你会得到'table_name' not found in keyspace 'keyspace' 如果它确实存在,你会得到表的描述。
对于 .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 版。