2016-05-31 103 views
1

我一直在试图决定组织sql查询和代码的最佳方式。Golang如何让我的SQL查询不在我的代码中?

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

虽然通过向其中投入大量的sqlQueries,但我一直在混淆我的代码,特别是对于事务处理,而不是。

我怎样才能构建我的代码,而不用乱扔SQL查询。

(我不想使用ORM做到这一点)

+0

https://github.com/mattermost/platform作为商店和模型分开,就像他们在这里做的一样。 – khrm

+0

如何使用存储过程?内联SQL通常被认为是非常糟糕的做法,不仅出于代码清晰的原因,而且因为当您使用诸如'fm.Sprintf'之类的东西来形成查询字符串时,您无法保护自己免受SQL注入攻击。还要检查sql包中的'Prepare',它会返回一个'* Stmt',您可以根据需要重新使用它。 – evanmcdonnal

+1

您可以尝试https://github.com/nleof/goyesql:解析文件并将SQL查询关联到地图。用于从代码逻辑中分离SQL。 – molivier

回答

1

您可以实现的东西,看起来像一个data mapper pattern。从EAA目录

实施例:

enter image description here

在围棋:

模型/ person.go

type Person struct { 
    Lastname string 
    Firstname string 
    Dependents int 
} 

映射器/ person.go

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 
} 

但是,该解决方案只是解决方案的一部分。关于数据库交易,我认为你应该从另一个“层”管理它们。