当前位置: 首页 > 面试题库 >

go-sql-driver Scan()的命名键

韶亮
2023-03-14
问题内容

使用时go-sql-driver,感觉就像我在重新发明轮子。我习惯于使用具有User与数据库模型严格相关的数据模型(如类)的语言。然后,您当然可以具有要在API上公开的内容的其他模型,但是仍然有数据库对象的模型。在Go中,我不确定如何做到这一点的最佳方法。下面是一个GetUserByEmail功能。

func GetUserByEmail(email string) (*myapp.User, error) {
    smt, err := database.Prepare("SELECT * FROM users WHERE email = ?")

    if err != nil {
        return nil, err
    }

    rows, err := smt.Query(email)
    defer rows.Close()

    if err != nil {
        return nil, err
    }

    var users []*myapp.User

    for rows.Next() {
        var id string
        var confirmed bool
        var password string
        var email string
        var updated string
        var created string
        err = rows.Scan(&id, &confirmed, &password, &email, &updated, &created)

        if err != nil {
            return nil, err
        }

        user := myapp.User{id, confirmed, created, password, email, updated}
        users = append(users, &user)
    }

    if users == nil || len(users) == 0 {
        return nil, errors.New("User not found.")
    }

    if len(users) != 1 {
        return nil, errors.New("Nr of users fetched: " + string(len(users)) + ". Expected: 1.")
    }

    return users[0], nil
}

这里的一个问题是,如果我更改数据库中password和的顺序email,我的应用程序将以静默方式切换它们,并且不会出现任何错误。这是一种可怕的危险行为。可以Scan()以某种方式取得钥匙还是可以其他方式进行?我当然可以查看Columns()并从那里将索引顺序作为一个int(尽管Go似乎没有内置该函数)并将其映射到我的User变量,但是我真的需要对我的所有数据库进行所有这些操作吗?方法?它是抽象的吗?还是我需要自己做?


问题答案:

这里的一个问题是,如果我更改数据库中密码和电子邮件的顺序,我的应用程序将以静默方式进行切换,并且不会出错。

可以说,解决此问题的最佳方法就是根本不使用SELECT *-始终为您的列命名。问题*实际上可能比您描述的要大-
如果添加新列,您的查询甚至不需要什么?您的代码将无故中断。

但是关于您的更大问题…

可以Scan()以某种方式取得钥匙还是可以其他方式进行?

标准库sql程序包不提供此功能。但是,可以使用第三方库。sqlx可能是最受欢迎的一种,它与标准库最相似。这是我的建议。

如果您更喜欢痛苦,痛苦和永无止境的流血冲突,那么诸如gorm或gorp之类的事情也是可能的。



 类似资料:
  • 主要内容:语法,示例SQL 允许对表进行重命名。有时候我们为表使用了无意义的名称,因此需要更正。 语法 SQL 支持两种重命名表的方式: ALTER TABLE old_table_name  RENAME TO new_table_name;  RENAME old_table _name TO new_table_name; old_table_name 为旧的表名,new_table_name 为新的表名。 示

  • 可以在映射文档中定义查询的名字,然后就可以象调用一个命名的 HQL 查询一样直接调用命名 SQL 查询.在这种情况下,我们不 需要调用 addEntity() 方法。 <sql-query name="persons"> <return alias="person" class="eg.Person"/> SELECT person.NAME AS {person.name},

  • 函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。 如果命名了返回值参数,一个没有参数的return语句,会将当前的值作为返回值返回。注意,如果遇到if等代码块和返回值同名,还需要显示写出返回值。 package main import "fmt" func split(sum int) (x, y int) { x = sum *

  • 问题内容: 是否可以在SQL Server中重命名约束?我不想删除并创建一个新的约束,因为此约束会影响其他已经存在的约束,因此我将不得不重新创建/更改这些约束。 问题答案: 您可以重命名使用sp_rename使用 这适用于sys.objects中列出的包含约束的对象

  • Go对于接口和其实现的命名规范是什么? 假设整个Web项目都依赖于接口,比如service: 但是好像对于GO来说一般不像在Java一样在后面加interface或者Imp来标识,之前看到有人是直接以大小写的UserService和userService来区分接口和实现,但是这样的话构造函数就只能返回接口不能返回具体实现了。 对于repository也有相同的疑问,对于dao和cache我是直接接

  • 问题内容: 我不完全确定行业中是否有标准,所以我在这里问。 我正在命名一个 Users 表,但是我不确定如何命名成员。 是一个显而易见的选项,但我想知道是否应在所有其他字段之前加上“ user_”作为前缀。 user_name user_age 或只是姓名和年龄等… 问题答案: 像这样的前缀是没有意义的,除非您有一些随意性。就像两个地址一样。然后,您可以使用地址_1,地址_2,地址_家庭等 与电话