2013-04-15 24 views
20

C'è un modo semplice per verificare se la tabella (famiglia di colonne) è definita in Cassandra usando CQL (o API forse, usando com.datastax.driver)?Come verificare se esiste una tabella Cassandra

In questo momento mi sto appoggiando all'esecuzione di SELECT 1 FROM table e controllo per eccezione ma forse c'è un modo migliore?

risposta

22

A partire da 1.1, è possibile interrogare lo spazio chiavi system, famiglia di colonne schema_columnfamilies. Se si sa quale spazio delle chiavi si desidera controllare, questo CQL dovrebbe elencare tutte le famiglie delle colonne in uno spazio delle chiavi:

SELECT columnfamily_name 
FROM schema_columnfamilies WHERE keyspace_name='myKeyspaceName'; 

Il rapporto descrive questa funzionalità è qui: https://issues.apache.org/jira/browse/CASSANDRA-2477

Anche se, fanno notare che alcuni dei i nomi delle colonne di sistema sono cambiati tra 1.1 e 1.2. Quindi potresti dover fare un po 'di fatica per ottenere i risultati desiderati.

Modifica 20.160.523 - Cassandra 3.x Aggiornamento:

Si noti che per Cassandra 3.0 in su, è necessario fare qualche aggiustamento alla query di cui sopra:

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

Funziona con CQL 3 ma non con CQL 1 o 2: SELECT columnfamily_name FROM System.schema_columnfamilies WHERE keyspace_name = 'myKeyspaceName'; – Datageek

+0

Se qualcuno controlla se esiste una tabella e, in caso contrario, se la crea, allora questo metodo non è sicuro per i thread. Se più thread/client eseguono questo tipo di azione contemporaneamente, selezionare potrebbe non restituire alcun risultato, ma l'istruzione CREATE potrebbe già fallire. In tal caso è meglio andare con una soluzione basata su eccezioni. –

+0

non funzionerà con il driver Datastax v3.0. Usa KeyspaceMetadata/TableMetadata per quello –

17

Java autista (dal momento che lei ha citato nella sua domanda) mantiene anche una rappresentanza locale dello schema:

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

I metadati tabella sarà n ull se il tavolo non esiste.

+0

Buona risposta! Non ho nemmeno pensato * sull'uso di 'TableMetadata' per quello. – Aaron

+0

Perfetto! In questo modo puoi anche accedere facilmente alle definizioni delle colonne. – luk2302

+0

Funziona alla grande con il driver DataStax v3, grazie Olivier! – albogdano

3

Ho solo bisogno di verificare manualmente l'esistenza di una tabella utilizzando cqlsh. Informazioni generali utili.

describe keyspace_name.table_name 

Se non esiste si otterrà 'table_name' non trovato in spazio delle chiavi 'spazio delle chiavi' Se esiste si otterrà una descrizione della tabella.

Problemi correlati