cqlengine在模式更改后不在新字段中插入值(cassandra)

fzwojiic  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(282)

在使用cqlengine python库在cassandra中更改了表的模式之后,我尝试将行插入到表中。更改前,模型看起来像:

  1. class MetricsByDevice(Model):
  2. device = columns.Text(primary_key=True, partition_key=True)
  3. datetime = columns.DateTime(primary_key=True, clustering_order="DESC")
  4. load_power = columns.Double()
  5. inverter_power = columns.Double()

我将模式更改为这样,添加了四列(dso、node、park和commercializer):

  1. class MetricsByDevice(Model):
  2. device = columns.Text(primary_key=True, partition_key=True)
  3. datetime = columns.DateTime(primary_key=True, clustering_order="DESC")
  4. DSO = columns.Text(index=True, default='DSO_1'),
  5. node = columns.Text(index=True, default='Node_1'),
  6. park = columns.Integer(index=True, default=6),
  7. commercializer = columns.Text(index=True, default='Commercializer_1'),
  8. load_power = columns.Double()
  9. inverter_power = columns.Double()

然后,我将表与包含行的脚本同步

  1. sync_table(MetricsByDate)

我检查了数据库,已经创建了四列。现有行的这些字段的值为null(如预期的那样)。
然后我修改了负责在批处理行中插入的脚本,包括与新字段对应的值。它看起来像:

  1. batch = BatchQuery()
  2. for idx, message in enumerate(consumer):
  3. data = message.value
  4. ts_to_insert = dateutil.parser.parse(data['timestamp'])
  5. filters = get_filters(message.partition_key)
  6. MetricsByDate.batch(batch).create(
  7. device=device,
  8. date=str(ts_to_insert.date()),
  9. time=str(ts_to_insert.time()),
  10. created_at=now,
  11. DSO=str(filters['DSO']),
  12. node=str(filters['node']),
  13. park=int(filters['park']),
  14. commercializer=str(filters['commercializer']),
  15. load_power=data['loadPower'],
  16. inverter_power=data['inverterPower'],
  17. )
  18. if idx % 100 == 0: # Insert every 100 messages
  19. batch.execute()
  20. # Reset batch
  21. batch = BatchQuery()

我已经检查了与新字段对应的值是否为none,并且具有正确的类型。尽管如此,它仍然正确地插入了所有行,但新字段中的值在cassandra中为空。
批插入不会返回任何错误。我不知道我是否遗漏了什么,或者是否需要执行额外的步骤来更新模式。我一直在查文件,但找不到任何有用的。
我做错什么了吗?
编辑
在亚历克斯·奥特的建议之后,我已经一行一行地插入了。将代码更改为:

  1. for idx, message in enumerate(consumer):
  2. data = message.value
  3. ts_to_insert = dateutil.parser.parse(data['timestamp'])
  4. filters = get_filters(message.partition_key)
  5. metrics_by_date = MetricsByDate(
  6. device=device,
  7. date=str(ts_to_insert.date()),
  8. time=str(ts_to_insert.time()),
  9. created_at=now,
  10. DSO=str(filters['DSO']),
  11. node=str(filters['node']),
  12. park=int(filters['park']),
  13. commercializer=str(filters['commercializer']),
  14. load_power=data['loadPower'],
  15. inverter_power=data['inverterPower'],
  16. )
  17. metrics_by_date.save()

如果在执行行之前 metrics_by_date.save() 我添加这些打印语句:

  1. print(metrics_by_date.DSO)
  2. print(metrics_by_date.park)
  3. print(metrics_by_date.load_power)
  4. print(metrics_by_date.device)
  5. print(metrics_by_date.date)

输出为:

  1. (<cassandra.cqlengine.columns.Text object at 0x7ff0b492a670>,)
  2. (<cassandra.cqlengine.columns.Integer object at 0x7ff0b492d190>,)
  3. 256.99
  4. SQ3-3.2.3.1-70-17444
  5. 2020-04-22

在新字段中,我得到一个cassandra对象,但在其他字段中,我得到它们的值。它可能是一个线索,因为它继续在新列中插入null。

pwuypxnk

pwuypxnk1#

我终于明白了。
这是一件愚蠢的事情,在模型定义中,不是因为knwon的原因,我在单独的字段中添加了逗号,而不是换行符。。。因此,将模型定义更正为:

  1. class MetricsByDevice(Model):
  2. device = columns.Text(primary_key=True, partition_key=True)
  3. datetime = columns.DateTime(primary_key=True, clustering_order="DESC")
  4. DSO = columns.Text(index=True, default='DSO_1')
  5. node = columns.Text(index=True, default='Node_1')
  6. park = columns.Integer(index=True, default=6)
  7. commercializer = columns.Text(index=True, default='Commercializer_1')
  8. load_power = columns.Double()
  9. inverter_power = columns.Double()

真管用!!

相关问题