2016-01-06 52 views
4

我試圖在卡桑德拉數據庫中使用Python和DataStax驅動程序(Python - > Cassandra)存儲一些鳴叫。如何插入在卡桑德拉沒有空值列

一切運作良好,但有一些我不明白。 如何插入沒有空值的行?

作爲例子,

CREATE TABLE tweets (

id_tweet text PRIMARY KEY, 
texttweet text, 
hashtag text, 
url text, 
) 

如果我想插入一行沒有URL值,它的工作,但在卡桑德拉我會在網址列中看到「空」。

我檢查這個文檔:

http://datastax.github.io/python-driver/getting_started.html#passing-parameters-to-cql-queries

所以,我想2點型動物的方式:

首先一個,我創建的字符串作爲一個完整的字符串,並執行它。

requete = "insert into Tweets(id_tweet,texttweet,hashtag,url) values ('%s','%s','%s','%s')"%(id_tweet,texttweet,hashtag,url) 
session.execute(requete) 

或者
我送的執行功能參數。

requete2 = "insert into Tweets(id_tweet,texttweet,hashtag,url) values ('%s','%s','%s','%s')" 
session.execute(requete2,(id_tweet,id_texttweet,hashtag,url)) 

問題是,在2differents方式給我空值,如果我沒有得到任何URL或主題標記在我的鳴叫爲例。

如果它在一行中是空的,是否有可能看不到該列,就像我在很多教程中看到的一樣?

enter image description here

謝謝。

回答

6

如果您使用Cassandra 2.2或更高版本,您可以執行此操作。在Cassandra 2.2中引入了「UNSET」的概念。這使您可以使用相同的語句來插入行,即使你不想提供一些值,這裏是你會怎麼做:

from cassandra.query import UNSET_VALUE 
ps = session.prepare("insert into tweets(id_tweet,texttweet,hashtag,url) values (?,?,?,?)") 
session.execute(ps, ("id", "hello world!", UNSET_VALUE, UNSET_VALUE)); 

這表明到你不卡桑德拉」 t想要將這些值插入爲null,而不是將它們全部省略,因此不會將'null'值(內部是墓碑)插入到cassandra中。

在你身邊,我想你需要做一些預處理邏輯來將任何傳入的None值轉換爲UNSET_VALUE。 2.2之前的解決方案是根據不存在的列來調整查詢,即insert into tweets(id_tweet,texttweet) values (?,?),如果hashtag和url是None

在檢索方面,技術上應該區分空值和未設置值(我會研究這個),但我不認爲這種機制存在於python驅動程序中。如果可能在協議中執行該功能,但是該功能不在驅動程序中,我會打開一張票。EDIT:它看起來並不像cassandra區分顯式設置爲null的值(在內部標記爲墓碑)和返回數據時從未設置的值。

您可以在this blog post的Python驅動程序中閱讀有關'UNSET'和其他2.2功能的更多信息。

+0

Exaclty我在找什麼。謝謝 – GreGGus