2014-05-08 213 views
11

我想從MySQL遷移到Cassasndra我的數據庫。我面臨的問題是列類型定義爲Enum(枚舉('GP','NGP','PGP','PAGP'))。 Cassandra不支持Enum數據類型(儘管它支持集合)。有沒有一種方法可以在Cassandra中實現枚舉數據類型,以便列的值應該限制在一組值中?我正在使用Apache Cassandra 2.0.7版。卡桑德拉枚舉數據類型

+0

另請參見[Datastax java驅動程序3.0.0枚舉註釋未找到](http://stackoverflow.com/a/35135223) –

回答

4

據我所知,在閱讀有關cql類型的文檔後,不能直接在cql語句中使用enum(我爲java客戶端檢查了這一點)。

因此,您擁有的選項是將Enum轉換爲String以將字段包含在cql語句中。通過這種方式,您的所有應用程序都使用Enum,但在後端層使用該枚舉的字符串表示形式。

+0

是在文檔中沒有像Enum這樣的數據類型。我想我需要複製這種行爲。但是,如果我打算將當前的數據庫從MySQL遷移到Cassandra,那麼有什麼選擇呢? – Nayan

+0

選項?你什麼意思? – ftrujillo

+0

我的意思是我目前使用支持Enum的MySQL。但基於我的某些商業因素,我可能會遷移到卡桑德拉。在那種情況下,我如何支持Cassandra中的枚舉類型列。可能是我沒有通過客戶端與Cassandra進行交互,可能直接使用CQLSH進行交互。在那種情況下如何使用Enum類型列? – Nayan

3

我面臨同樣的問題用一個整數枚舉......這裏就是我所做的:

MappingConfiguration.Global.Define(
    new[] { 
     new Map<Login>() 
      .TableName("logins") 
      .PartitionKey(el => el.UserId) 
      .Column(el => el.UserId, cm => cm.WithName("user_id")), 
      .Column(el => el.Gender, cm => cm.WithName("gender_id").WithDbType<int>()), 
    }); 

使用C#2.5的驅動程序和DSE 4.7。

9

見datastax卡桑德拉對象映射API,

http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html

enum Gender { FEMALE, MALE }; 

// FEMALE will be persisted as 'FEMALE' 
@Enumerated(EnumType.STRING) 
private Gender gender; 

// FEMALE will be persisted as 0, MALE as 1 
@Enumerated(EnumType.ORDINAL) 
private Gender gender 

的卡桑德拉3.0

enum State {INIT, RUNNING, STOPPING, STOPPED} 

cluster.getConfiguration().getCodecRegistry() 
     .register(new EnumNameCodec<State>(State.class)); 

// schema: create table name_example(id int PRIMARY KEY, state text) 
session.execute("insert into name_example (id, state) values (1, ?)", State.INIT); 
// state is saved as 'INIT' 

http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/extras/