Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang我怎样才能不让SQL查询进入我的代码?_Sql_Go - Fatal编程技术网

Golang我怎样才能不让SQL查询进入我的代码?

Golang我怎样才能不让SQL查询进入我的代码?,sql,go,Sql,Go,我一直在努力决定组织sql查询和代码的最佳方式 现在,我的包中有一个models/文件夹,其中包含我的所有表,每个表都位于它们自己的.go文件中,其中包含一个与数据库表匹配的结构 我一直在把我的代码弄得一团糟,因为我在代码中加入了大量的sqlQueries,特别是对于事务之类的东西 如何准确地构造代码,而不使用SQL查询 (我不想使用ORM来实现这一点)您可以实现类似于ORM的东西 EAA目录中的示例: 在围棋中: model/person.go type Person struct {

我一直在努力决定组织sql查询和代码的最佳方式

现在,我的包中有一个
models/
文件夹,其中包含我的所有表,每个表都位于它们自己的
.go
文件中,其中包含一个与数据库表匹配的结构

我一直在把我的代码弄得一团糟,因为我在代码中加入了大量的sqlQueries,特别是对于事务之类的东西

如何准确地构造代码,而不使用SQL查询


(我不想使用ORM来实现这一点)

您可以实现类似于ORM的东西

EAA目录中的示例:

在围棋中:

model/person.go

type Person struct {
  Lastname   string
  Firstname  string
  Dependents int
}
package mapper

import m "whatever/model"

type PersonMap struct { }

func (m *PersonMap) Insert(p *m.Person) error {
  // SQL query
  return nil
}

func (m *PersonMap) Update(p *m.Person) error {
  // SQL query
  return nil
}

func (m *PersonMap) Delete(p *m.Person) error {
  // SQL query
  return nil
}
mapper/person.go

type Person struct {
  Lastname   string
  Firstname  string
  Dependents int
}
package mapper

import m "whatever/model"

type PersonMap struct { }

func (m *PersonMap) Insert(p *m.Person) error {
  // SQL query
  return nil
}

func (m *PersonMap) Update(p *m.Person) error {
  // SQL query
  return nil
}

func (m *PersonMap) Delete(p *m.Person) error {
  // SQL query
  return nil
}

然而,这一解决办法只是解决办法的一部分。关于数据库事务,我认为您应该从另一个“层”对它们进行管理。

将它们作为存储和模型分开,就像它们在这里所做的那样。使用存储过程如何?通常,内联SQL被认为是非常糟糕的做法,这不仅是因为代码清晰,而且还因为当您使用
fm.Sprintf
之类的东西来形成查询字符串时,您没有保护自己不受SQL注入的影响。另外,请查看sql包中的
Prepare
,它返回一个
*Stmt
,您可以随意重用它。您可以尝试:解析文件并将sql查询与映射关联。用于将SQL与代码逻辑分离。您还可以查看drone存储库的实现:这不是一个具体的golang问题。但有些扩展可能会有所帮助,例如Sqlx: