【问题标题】:Insert,update ,delete,drop sample code by using relation algebra使用关系代数插入、更新、删除、删除示例代码
【发布时间】:2021-10-18 23:07:37
【问题描述】:

我是新的 Apache Calcite,能够使用关系代数从数据库中获取数据,但无法执行插入、更新、删除、删除操作。如果可以分享示例代码会更有帮助。

【问题讨论】:

  • 请说明您的尝试以及为什么没有帮助。
  • 最终 FrameworkConfig config = config().build();最终 RelBuilder builder = RelBuilder.create(config); final RelNode node = builder.scan("enliven") //.di​​stinct() //.peek(0); //.project(builder.field("Name"),builder.field("event_id")) //.project(builder.field("Name")) //.limit(0, 1) .build() ; PreparedStatement pd = RelRunners.run(node); ResultSet 结果集 = pd.executeQuery();
  • 上一个是从方解石中获取数据,下一个是插入数据 final RelNode node1 =builder.scan("enliven") //.di​​stinct() //.peek(0); .project(builder.field("Name"),builder.field("event_id")) .values(string, values) //.project(builder.field("Name")) //.limit(0, 1 ) 。建造(); PreparedStatement pd1 = RelRunners.run(node1); pd1.execute();
  • edit您的问题并在那里插入所有内容。

标签: apache-calcite


【解决方案1】:

据我所知,RelBuilder 无法为 INSERT、UPDATE、DELETE、DROP 操作构建RelNode

对于 DML (INSERT, UPDATE, DELETE, MERGE),等效的关系代数使用TableModify,因此您可以调用LogicalTableModify.create 来构建一个TableModify 节点并使用RelBuilder 来构建一个RelNode`` 为其输入如下:

RelNode node = builder.scan("envliven").project("Name");
TableModify modifyNode = LogicalTableModify.create((table,
  schema, node,
  UPDATE, updateColumnList,
  sourceExpressionList, flattened);

对于DDL(DROP, CREATE, ALTER),没有对应的关系代数,但是可以像CalcitePrepareImpl.executeDdl一样直接使用SqlNode来执行。

例如:

update nation set n_nationkey = 1 where n_nationkey = 2;

RelNode如下:

LogicalTableModify(table=[[test, nation]], operation=[UPDATE], updateColumnList=[[n_nationkey]], sourceExpressionList=[[1]], flattened=[false]) 
  LogicalProject(n_nationkey=[$0], n_name=[$1], n_regionkey=[$2], n_comment=[$3], EXPR$0=[1]) 
   LogicalFilter(condition=[=($0,2)])
     LogicalTableScan(table=[[test, nation]])

对于 UPDATE,updateColumnList 具有您更新的列,sourceExpressionList 具有新值。

对于插入:

insert into nation(n_nationkey, n_name) values(1, 'test');

RelNode如下:

LogicalTableModify(table=[[test, nation]], operation=[INSERT], flattened=[false])
  LogicalProject(n_nationkey=[$0], n_name=[$1], n_regionkey=[null], n_comment=[null])
    LogicalValues(tuples=[[{ 1, _UTF-16'test                     ' }]])

【讨论】:

  • 感谢您的回复。你能告诉我我们可以在哪里设置你共享的给定源代码的值以插入和更新表
  • @KamatchiGunasekaran 我添加了两个更新和插入示例。
  • @KamatchiGunasekaran 如果这个答案有帮助,您可以投票并接受它。
  • 谢谢..让我试试
猜你喜欢
  • 2016-10-06
  • 2012-03-23
  • 1970-01-01
  • 2015-04-01
  • 2020-03-18
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2019-06-14
相关资源
最近更新 更多