令人兴奋的Beta 9版本的幕后
#community #database #surrealdb

我们的团队一直在为新版本而努力,该版本引入了许多新功能,错误修复和性能改进you can see here

但是,Beta 9发行的故事与我们的团队无关。是关于你的!

您如何使用数据库和必须改进的想法。

让我们探讨其中的一些想法以及它们最终如何被释放。

SELECT语句返回一个字段

Brian(Du-z)去年9月加入了我们的社区,并做出了一些巨大的贡献,including the one you’re reading about.

他注意到查询SELECT name FROM user会导致以下内容。

[
  {
    "Name": "Name 1"
  },
  {
   "Name": "Name 2"
  }
]

但是,他觉得应该更容易进行序列化和使用简单的字符串数组。

[
  "Name 1",
  "Name 2"
]

他为基于Cosmosdb的FIELD关键字提供了这个非常有用的建议:

SELECT VALUE name FROM user

经过一些讨论,这是由我们的团队实施的,现在您可以借助Brian!

SELECT VALUE name FROM user

带有DEFINE FUNCTION语句的自定义功能

塞巴斯蒂安( mathe42 )自去年9月以来一直是一个非常活跃的社区成员,大约有20个拉力请求和许多其他伟大的贡献like this one

对于他的用例,他正在寻找某种用户定义的功能,这些功能可以使我们拥有一个可可的sultealql指令列表。

他提出了这个如何完成的示例:

-- Define a procedure to get a person

DEFINE PROCEDURE get_person ($firstname, $lastname, $birthdate) {
  LET $person = SELECT * FROM person WHERE firstname = $firstname AND lastname = $lastname AND birthdate = $birthdate;

  IF (COUNT($person)==1) THEN
     RETURN 1;
  ELSE
    RETURN CREATE person {
       firstname: $firstname,
       lastname: $lastname,
       birthdate: $birthdate
    }
  END
}

-- and call it by
LET $myPerson = CALL get_person('Sebastian', 'Krüger', '2022-09-21')

经过一些讨论和托比的一些魔力,您现在可以定义全局数据库范围的自定义功能!

-- Define a global function which can be used in any query
DEFINE FUNCTION fn::get_person($first: string, $last: string, $birthday: string) {

    LET $person = SELECT * FROM person WHERE [first, last, birthday] = [$first, $last, $birthday];

    RETURN IF $person[0].id THEN
        $person[0];
    ELSE
        CREATE person SET first = $first, last = $last, birthday = $birthday;
    END;

};

-- Call the global custom function, receiving the returned result
LET $person = fn::get_person('Tobie', 'Morgan Hitchcock', '2022-09-21');

这允许复杂或重复定义的代码在数据库的任何查询中无缝运行。

自定义函数支持带有自定义逻辑的多个嵌套查询。

所有这些始于塞巴斯蒂安(Sebastian)在数据库中想要什么的想法,谢谢塞巴斯蒂安!

代码块和高级表达式

汤姆( tomsseisums )也加入了我们在9月的旅程中,并分享了一些可以做得更好的见解,例如this use case

他试图从“ SurreAlDB作为后端”的角度将自己的项目适应SurseAlDB,而在SurreAlDB的力量中,我们可以在SurreAldB中处理所有数据操作,而无需任何中间层。

他试图在CREATE/UPDATE中设置带有丰富表情的事件和领域,但面临解析错误。

这是汤姆想做的几件事之一:

CREATE metrics SET average_sales = (
    LET $sales = (SELECT quantity FROM sales);
    LET $total = math::sum($sales);
    LET $count = count($sales);

    RETURN ($total / $count);
);

但是,当他收到意外的解析错误时,他感到失望。

{
    "code": 400,
    "details": "Request problems detected",
    "description": "There is a problem with your request. Refer to the documentation for further information.",
    "information": "There was a problem with the database: Parse error on line 1 at character 15 when parsing 'SET average_sales = (\n    LET $sales = (SELECT quantity FROM sales);\n    LET $total = math::sum($sal'"
}

这不阻止他想要存在,因此他创建了一个feature request for it

经过一些讨论和更多的魔力,现在有可能,借助汤姆!

DEFINE FIELD average_sales ON metrics VALUE {
    LET $sales = (SELECT VALUE quantity FROM sales);
    LET $total = math::sum($sales);
    LET $count = count($sales);
    RETURN ($total / $count);
};

现在,您可以运行代码块,并支持任意数量的语句,包括LETRETURN

这允许编写高级自定义逻辑并允许对数据操作进行更复杂的处理。

谢谢大家,与我们一起成为这一雄心勃勃的旅程的一部分!

我们只刮擦了发布的内容,您可以find more here

我们总是很乐意一起工作on GitHubour Discord server

我们期待着您接下来想到哪些想法和改进!

在此之前,我们将分享有关一些新功能的更深入的博客文章。