我正在尝试使用Python和DataStax驱动程序(Python - > Cassandra)在Cassandra数据库中存储一些推文.
一切都运作良好,但有一些我无法理解的东西.如何插入没有空值的行?
例如,
CREATE TABLE tweets ( id_tweet text PRIMARY KEY, texttweet text, hashtag text, url text, )
如果我想插入没有url值的行,它可以正常工作,但在Cassandra中,我会在url列中看到"null".
我查看这个doc:
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种不同的方式会给我空值.
如果列连续为空,是否有可能看不到列,就像我在很多教程中看到的那样?
谢谢.
如果您使用的是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 (?,?)
hashtag和url是否None
.
在检索端,技术上应该远离区分null和unset值(我会看看这个),但我不认为这样的机制存在于python驱动程序中.如果可以在协议中执行,我将打开一张票,但驱动程序中不存在该功能. 编辑:它看起来不像cassandra区分显式设置为null的值(内部标记为墓碑)和返回数据时从未设置的值.
您可以在此博客文章中阅读有关python驱动程序中的"UNSET"和其他2.2功能的更多信息.