2016-01-06 68 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