内置sql支持

V语言编译器内置实现了类似sql语句的支持,在语法级别实现了一个轻量级的orm。

语法效果比库级别实现的orm框架要简单,好用许多。

这样实现的好处有:

  • 针对不同的数据库,统一的一套语法,这样迁移到其他数据库变得更容易。

  • SQL语法内置在V语言的语法中,不需要学习其他的语法。

  • 安全,不可以通过注入生成SQL语句。

  • 编译时检查,语法错误在编译时就可以被捕捉到。

  • 简单易读,不再需要手工解析结果和构造对象。

基本步骤:

  1. 定义结构体

  2. 创建数据库连接

  3. 使用sql代码块

定义结构体

基本的思路跟大部分orm框架一样:结构体对应表,结构体字段对应表字段。

struct Foo {
    id          int         [primary; sql: serial]
    name        string      [nonull]
    created_at  time.Time   [sql_type: 'DATETIME']
    updated_at  string      [sql_type: 'DATETIME']
    deleted_at  time.Time
    children    []Child     [fkey: 'parent_id']
}

struct Child {
    id        int    [primary; sql: serial]
    parent_id int
    name      string
}

使用注解对结构体和字段进行标注

结构体注解

  • [table: 'name']

    默认情况,生成的数据库表名就是结构体名,大小写一致,没有加复数。

    也可以使用这个注解自定义表名

字段注解

  • [sql: 'name']

    自定义字段名

  • [primary]

    标记字段为主键

  • [unique]

    标记字段唯一,不可重复

  • [unique: 'foo']

    将字段加入到unique group中

  • [nonull]

    字段不允许为空值

  • [default: 'sql default']

    设置字段的默认值

  • [skip]

    跳过字段,不生成表字段

  • [sql: type]

    字段V语言中的类型,其中有一个特别的类型:serial自增长。

    这个标注有点多余,感觉应该合并到sql_type注解中

  • [sql_type: 'SQL TYPE']

    指定字段对应生成sql的类型

  • [fkey: 'parent_id']

    指定外键的字段名

主键类型

结构体中的主键可以是int类型,也可以是string类型。

int类型可以设置注解[sql:serial],自动生成

string类型可以设置注解[default: 'gen_random_uuid()'; primary; sql_type: 'uuid'],自动生成

time类型可以设置注解[default: 'CURRENT_TIMESTAMP'; sql_type: 'TIMESTAMP'],自动生成

其中gen_random_uuid(),CURRENT_TIMESTAMP为pg数据库的内置函数,放在default注解中,会自动执行,并返回结果作为字段默认值。

创建数据库连接

开始使用sql代码块前,要先创建数据库连接,然后将该连接给sql代码块使用。

使用sql代码块

创建表

删除表

插入语句

更新语句

删除语句

查询语句

只有查询语句可以返回结果

指定字段返回:

目前在sql代码块中还不支持,只能通过orm_select_gen()方法动态构造。

sql代码块错误处理

如果sql代码块返回错误,可以使用or代码块进行错误处理:

完整例子:

使用db.exec()方法

除了可以使用代码块语句,也可以直接使用db.exec()方法来执行各种sql语句

sql事务

暂无

关联查询

暂无

聚合函数

生成sql语句函数

orm模块中提供了生成sql语句的函数,生成更复杂的sql语句。

参考测试代码:

更详细的代码可以参考内置的orm模块:vlib/orm。

最后更新于

这有帮助吗?