Golang中的数据库CRUD操作

324 阅读3分钟

这个例子将CRUD操作分为两个部分,即 "写 "和 "读"。写 "部分包括INSERT,UPDATEDELETE 查询。读 "部分涵盖了SELECT 查询。我们也在使用context.WithTimeout 来终止长期运行的查询。请注意SELECT 查询,因为它们依赖于一个叫做MAX_EXECUTION_TIME 的东西。

插入/更新/删除

预备(安全选项)

如果你不能100%确定查询参数是没有SQL注入的,那么首选这个。

这是一个缓慢的操作,因为它是网络往返次数的三倍 (Prepare,ExecuteClose)。该查询使用? 参数占位符。

下面两个例子的工作方式完全相同,所以我建议使用第二个例子,因为它更干净。另外,无论查询参数是动态的还是静态的,它仍然是网络往返次数的三倍。

func Create(args ...interface{}) error {
func Create(args ...interface{}) error {
2020-03-13T13:14:36.035537Z 9 Prepare INSERT INTO leagues

格式化(不安全选项)

如果你100%确定查询参数不存在SQL注入问题,那么请选择这个选项。

这是一个快速的操作,因为它只发出一个网络往返(Query)。使用适当的参数格式化器,用fmt.Sprintf 函数来格式化查询。

func Create(args ...interface{}) error {
2020-03-13T13:30:26.812083Z 15 Query INSERT INTO leagues

注意

尽管我们使用context.WithTimeout 来取消长期运行的查询,但由于其协议性质,MySQL实际上不会终止基础查询。取消只发生在Go级别。然而,你可以通过使用MySQL的MAX_EXECUTION_TIME查询提示来解决SELECT 查询的这个问题,以便告诉MySQL服务器,如果它运行的时间超过了给定的时间限制,就终止执行。如果是这样,它将产生Error 3024: Query execution was interrupted, maximum statement execution time exceeded 错误。

选择一

预备(安全选项)

如果你不能100%确定查询参数是没有SQL注入的。

这是一个缓慢的操作,因为它是网络往返次数的三倍(Prepare,ExecuteClose )。该查询使用? 参数占位符。

无论查询参数是动态的还是静态的,它仍然会使网络往返次数增加三倍。

type League struct {
func Read(uuid string) (League, bool, error) {
2020-03-13T16:00:11.624465Z 16 Prepare SELECT

格式化(不安全选项)

如果你100%确定查询参数是没有SQL注入的。

这是一个快速的操作,因为它只发出一个网络往返(Query)。使用适当的参数格式化器,用fmt.Sprintf 函数对查询进行格式化。

func Read(uuid string) (League, bool, error) {
2020-03-13T16:06:49.526538Z 18 Query SELECT

选择 "大量"(SELECT MANY

预备(安全选项)

如果你不能100%确定查询参数是没有SQL注入的。

这是一个缓慢的操作,因为它是网络往返次数的三倍(Prepare,ExecuteClose)。该查询使用? 参数占位符。

无论查询参数是动态的还是静态的,它仍然会使网络往返次数增加三倍。

type League struct {
func Read(limit, offset int) ([]League, error) {
2020-03-13T16:35:51.216389Z 22 Prepare SELECT

格式化(不安全选项)

如果你100%确定查询参数是没有SQL注入的。

这是一个快速的操作,因为它只发出一个网络往返(Query)。使用适当的参数格式化器,用fmt.Sprintf 函数对查询进行格式化。

func Read(limit, offset int) ([]League, error) {
2020-03-13T16:39:42.933817Z 23 Query SELECT