我正在尝试使用Python和DataStax驱动程序(Python - > Cassandra)在Cassandra数据库中存储一些推文。
一切都运作良好,但有一些我无法理解的东西。 如何插入没有空值的行?
例如,
CREATE TABLE tweets (
id_tweet text PRIMARY KEY,
texttweet text,
hashtag text,
url text,
)
如果我想插入没有url值的行,它可以正常工作,但在Cassandra中,我会在url列中看到“null”。
我查看了这个文档:
http://datastax.github.io/python-driver/getting_started.html#passing-parameters-to-cql-queries
所以我尝试了两种不同的方式:
首先,我将String创建为一个完整的String,然后执行它。
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))
问题是,如果我的推文中没有URL或Hashtag,那么2种不同的方式会给我空值。
如果列连续为空,是否有可能看不到列,就像我在很多教程中看到的一样?
感谢。
答案 0 :(得分:9)
如果您使用的是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));
这表明cassandra你不想将这些值作为null插入,而是应该将它们全部一起省略,因此没有'null'值(在内部这些是墓碑)被插入到cassandra中。
在您方面,我认为您需要执行一些预处理逻辑,以将任何传入的None
值转换为UNSET_VALUE
。 2.2之前的解决方案是根据缺少的列调整您的查询,例如insert into tweets(id_tweet,texttweet) values (?,?)
如果#标签符号为None
。
在检索端,技术上应该远离区分null和unset值(我将研究这个),但我不认为python驱动程序中存在这样的机制。如果可以在协议中执行,我将打开一张票,但驱动程序中没有该功能。 编辑:它看起来不像cassandra区分值显式设置为null(内部标记为墓碑)和返回数据时从未设置的那些。
您可以在this blog post中的python驱动程序中阅读有关“UNSET”和其他2.2功能的更多信息。