Cassandra UDT: error: unpack requires a string argument of length 4
Cassandra UDT: error: unpack requires a string argument of length 4
使用[cqlsh 5.0.1 |卡桑德拉 2.1.5.469 | DSE 4.7.0 | CQL 规范 3.2.0 |本机协议 v3]
和 C# 2.5 驱动程序,我试图将用户设置表示为 UDT。
在 *.cql 脚本中定义了以下内容:
CREATE TYPE GeneralSettings (
last_changed timestamp,
last_tokaned timestamp,
tokan text,
emails list<text>,
);
CREATE TABLE users (
id timeuuid,
name text,
general_settings frozen<GeneralSettings>,
PRIMARY KEY (id)
);
在我的C#代码中定义如下:
public class UserGeneralSettings
{
public DateTimeOffset? LastChanged { get; set; }
public DateTimeOffset? LastTokened { get; set; }
public string Token { get; set; }
public IEnumerable<string> Emails { get; set; }
}
session.UserDefinedTypes.Define(
UdtMap.For<UserGeneralSettings>().Map(s => s.LastChanged, "last_changed")
.Map(s => s.LastTokened, "last_tokaned")
.Map(s => s.Token, "tokan")
.Map(s => s.Emails, "emails")
);
For<User>()
.TableName("users")
.PartitionKey(e => e.Id)
.Column(e => e.Id, cm => cm.WithName("id"))
.Column(e => e.Name, cm => cm.WithName("name"))
.Column(e => e.GeneralSettings, cm => cm.WithName("general_settings"));
我正在尝试使用 IMapper 界面将以下数据作为新用户记录插入:
newUser.GeneralSettings = new UserGeneralSettings
{
Emails = new [] { "test@provider.com" },
LastChanged = DateTimeOffset.UtcNow,
LastTokened = DateTimeOffset.UtcNow,
Token = "abcd-efg-hijk-lmnop-qrst-uvw-xyz",
};
但即使插入顺利进行,它似乎正在破坏我的用户 table,因为我无法使用 cqlsh select 从那个 table 获得任何东西。
我得到的错误是:
Traceback(最近调用最后):
文件“/usr/share/dse/resources/cassandra/bin/cqlsh”,第 1056 行,在 perform_simple_statement 行中 = self.session.execute(语句,跟踪=self.tracing_enabled)
文件“/usr/share/dse/resources/cassandra/bin/../lib/cassandra-driver-internal-only-2.5.1.zip/cassandra-driver-2.5.1/cassandra/cluster.py”,第 1405 行,在执行中结果 = future.result(超时)
文件“/usr/share/dse/resources/cassandra/bin/../lib/cassandra-driver-internal-only-2.5.1.zip/cassandra-driver-2.5.1/cassandra/cluster.py”,第 2976 行,结果提高 self._final_exception
错误:解压需要长度为 4
的字符串参数
有谁知道导致此错误的原因吗?
这是一个错误吗?
这听起来很像 CASSANDRA-7656。虽然,这应该在后来的 2.1 候选版本之一中得到修复。您要插入的任何值是否为空?
关于这里发生的事情,我的理论是 Cassandra 将 timestamp
与 C# DateTimeOffset
匹配。那就是 not 与 DateTimeOffset?
(可为空)相同。
将您的 UserGeneralSettings
class 更改为使用 DateTimeOffset
作为时间戳,而不是可空类型 (DateTimeOffset?
)。然后截断您的 table 并再次尝试插入。
使用[cqlsh 5.0.1 |卡桑德拉 2.1.5.469 | DSE 4.7.0 | CQL 规范 3.2.0 |本机协议 v3] 和 C# 2.5 驱动程序,我试图将用户设置表示为 UDT。
在 *.cql 脚本中定义了以下内容:
CREATE TYPE GeneralSettings (
last_changed timestamp,
last_tokaned timestamp,
tokan text,
emails list<text>,
);
CREATE TABLE users (
id timeuuid,
name text,
general_settings frozen<GeneralSettings>,
PRIMARY KEY (id)
);
在我的C#代码中定义如下:
public class UserGeneralSettings
{
public DateTimeOffset? LastChanged { get; set; }
public DateTimeOffset? LastTokened { get; set; }
public string Token { get; set; }
public IEnumerable<string> Emails { get; set; }
}
session.UserDefinedTypes.Define(
UdtMap.For<UserGeneralSettings>().Map(s => s.LastChanged, "last_changed")
.Map(s => s.LastTokened, "last_tokaned")
.Map(s => s.Token, "tokan")
.Map(s => s.Emails, "emails")
);
For<User>()
.TableName("users")
.PartitionKey(e => e.Id)
.Column(e => e.Id, cm => cm.WithName("id"))
.Column(e => e.Name, cm => cm.WithName("name"))
.Column(e => e.GeneralSettings, cm => cm.WithName("general_settings"));
我正在尝试使用 IMapper 界面将以下数据作为新用户记录插入:
newUser.GeneralSettings = new UserGeneralSettings
{
Emails = new [] { "test@provider.com" },
LastChanged = DateTimeOffset.UtcNow,
LastTokened = DateTimeOffset.UtcNow,
Token = "abcd-efg-hijk-lmnop-qrst-uvw-xyz",
};
但即使插入顺利进行,它似乎正在破坏我的用户 table,因为我无法使用 cqlsh select 从那个 table 获得任何东西。 我得到的错误是:
Traceback(最近调用最后):
文件“/usr/share/dse/resources/cassandra/bin/cqlsh”,第 1056 行,在 perform_simple_statement 行中 = self.session.execute(语句,跟踪=self.tracing_enabled)
文件“/usr/share/dse/resources/cassandra/bin/../lib/cassandra-driver-internal-only-2.5.1.zip/cassandra-driver-2.5.1/cassandra/cluster.py”,第 1405 行,在执行中结果 = future.result(超时)
文件“/usr/share/dse/resources/cassandra/bin/../lib/cassandra-driver-internal-only-2.5.1.zip/cassandra-driver-2.5.1/cassandra/cluster.py”,第 2976 行,结果提高 self._final_exception
错误:解压需要长度为 4
的字符串参数有谁知道导致此错误的原因吗? 这是一个错误吗?
这听起来很像 CASSANDRA-7656。虽然,这应该在后来的 2.1 候选版本之一中得到修复。您要插入的任何值是否为空?
关于这里发生的事情,我的理论是 Cassandra 将 timestamp
与 C# DateTimeOffset
匹配。那就是 not 与 DateTimeOffset?
(可为空)相同。
将您的 UserGeneralSettings
class 更改为使用 DateTimeOffset
作为时间戳,而不是可空类型 (DateTimeOffset?
)。然后截断您的 table 并再次尝试插入。