内置sql支持

V语言在编译器中实现了对sql的支持

这种在语言编译器内实现sql支持的做法比较少见,会给编译器增加复杂性,

但是对于使用者来说,比库级别实现的orm框架要简单,好用许多

V内置sql的好处有:

  • 针对不同的数据库,统一的一套语法,这样迁移到其他数据库变得更容易
  • SQL语法内置在V语言的语法中,不需要学习其他的语法
  • 安全,不可以通过注入生成SQL语句
  • 编译时检查,语法错误在编译时就可以被捕捉到
  • 简单易读,不再需要手工解析结果和构造对象
1. module main

3. import sqlite

5. struct User { // 数据库表对应到结构体,结构体名目前要求跟表名一致
6. id             int // 第一个字段必须是一个整型的id字段
7. age            int
8. name           string
9. is_customer    bool
10. skipped_string string [skip]
11. }

13. fn main() {
14. //连接数据库,返回DB类型
15. // db := sqlite.connect(':memory:') or {          //使用sqlite的内存数据库
16. db := sqlite.connect('./database.sqlite') or { // 使用文件数据库
17. panic(err)
18. }
19. // 定义表结构
20. db.exec('drop table if exists User')
21. db.exec("create table User (id integer primary key, age int default 0, name text default '', is_customer int default 0);")
22. // 插入数据
23. db.exec("insert into User (name, age) values ('Sam', 29)")
24. db.exec("insert into User (name, age) values ('Peter', 31)")
25. db.exec("insert into User (name, age, is_customer) values ('Kate', 30, 1)")
26. // v变量可以在sql中直接使用
27. name := 'Peter'
28. // 就像定义一个fn或struct那样,定义一个sql代码块,db是数据库连接变量,大括号中间只能是一条完整的sql语句
29. // 结构体直接作为表名,表名反倒不允许
30. result := sql db {
31. select count from User
32. }
33. println(result)
34. //
35. nr_users1 := sql db {
36. select count from User where id == 1
37. }
38. println(nr_users1)
39. //
40. nr_peters := sql db {
41. select count from User where id == 2 && name == 'Peter'
42. }
43. println(nr_peters)
44. // sql中可以直接使用v变量
45. nr_peters2 := sql db {
46. select count from User where id == 2 && name == name
47. }
48. println(nr_peters2)
49. nr_peters3 := sql db {
50. select count from User where name == name
51. }
52. println(nr_peters3)
53. //
54. peters := sql db {
55. select from User where name == name
56. }
57. println(peters[0].name)
58. // limit子句
59. one_peter := sql db {
60. select from User where name == name limit 1
61. }
62. println(one_peter.name)
63. // offset子句
64. y := sql db {
65. select from User limit 2 offset 1
66. }
67. println(y)
68. users3 := sql db {
69. select from User where age == 29 || age == 31
70. }
71. println(users3)
72. //
73. new_user := User{
74. name: 'New user'
75. age: 30
76. }
77. // insert语句,结构体直接作为表名,变量直接作为数据插入,后台自动把结构体和表结构对应起来
78. sql db {
79. insert new_user into User
80. }
81. // update语句
82. sql db {
83. update User set age = 31 where name == 'Kate'
84. }
85. new_age := 33
86. sql db {
87. update User set age = new_age, name = 'Kate N' where id == 3
88. }
89. // delete语句
90. // sql db {
91. // delete from User where id==4
92. // }
93. }

更详细的SQL内容,可以参考pg章节