如何在列中没有空值的情况下插入Cassandra

How insert in Cassandra without null value in Column

我正在尝试使用 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 种不同的方法会给我空值。

如果连续为空,是否可能看不到该列,就像我在很多教程中看到的那样?

谢谢。

如果您使用的是 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.

在检索端,技术上应该有区分空值和未设置值的方法(我会研究这个),但我认为 python 驱动程序。如果可以在协议中执行,但驱动程序中不存在该功能,我会开一张票。 编辑:它看起来不像 cassandra区分明确设置为 null 的值(在内部标记为逻辑删除)和返回数据时从未设置的值。

您可以在 this blog post 的 python 驱动程序中阅读有关 'UNSET' 和其他 2.2 功能的更多信息。