Datageek
Datageek

Reputation: 26689

How to check if a Cassandra table exists

Is there an easy way to check if table (column family) is defined in Cassandra using CQL (or API perhaps, using com.datastax.driver)?

Right now I am leaning towards executing SELECT 1 FROM table and checking for exception but maybe there is a better way?

Upvotes: 23

Views: 26236

Answers (4)

Manfred
Manfred

Reputation: 5666

For the .NET driver CassandraCSharpDriver version 3.17.1 the following code creates a table if it doesn't exist yet:

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);
}

You will need to adapt the list of table columns to your needs. This can also be awaited by using await _cassandraSession.ExecuteAsync(stmt).ConfigureAwait(false) in an async method.

Also, I want to mention that I'm using Cassandra version 4.0.1.

Upvotes: 0

Olivier Michallat
Olivier Michallat

Reputation: 2312

The Java driver (since you mentioned it in your question) also maintains a local representation of the schema.

Driver 3.x and below:

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

Driver 4.x and above:

Metadata metadata = session.getMetadata();
boolean tableExists =
  metadata.getKeyspace("myKeyspace")
    .flatMap(ks -> ks.getTable("myTable"))
    .isPresent();

Upvotes: 23

Aaron
Aaron

Reputation: 57748

As of 1.1 you should be able to query the system keyspace, schema_columnfamilies column family. If you know which keyspace you want to check, this CQL should list all column families in a keyspace:

SELECT columnfamily_name
FROM schema_columnfamilies WHERE keyspace_name='myKeyspaceName';

The report describing this functionality is here: https://issues.apache.org/jira/browse/CASSANDRA-2477

Although, they do note that some of the system column names have changed between 1.1 and 1.2. So you might have to mess around with it a little to get your desired results.

Edit 20160523 - Cassandra 3.x Update:

Note that for Cassandra 3.0 and up, you'll need to make a few adjustments to the above query:

SELECT table_name 
FROM system_schema.tables WHERE keyspace_name='myKeyspaceName';

Upvotes: 27

jorfus
jorfus

Reputation: 3088

I just needed to manually check for the existence of a table using cqlsh. Possibly useful general info.

describe keyspace_name.table_name

If it doesn't exist you'll get 'table_name' not found in keyspace 'keyspace' If it does exist you'll get a description of the table.

Upvotes: 7

Related Questions