内置sql支持

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

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

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

V内置sql的好处有:

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

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

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

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

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

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

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