Go-即使未设置NOT NULL,MySQL也会插入

时间:2019-05-01 17:24:01

标签: mysql go

我正在使用MySQL在Go中编写简单的API,但是即使列设置为NOT NULL,我的MySQL代码也会向行插入数据。这是我的代码:

schema.sql

CREATE TABLE IF NOT EXISTS seller (
    seller_id int NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL UNIQUE,
    contact varchar(255) NOT NULL,
    street varchar(255) NOT NULL,
    city varchar(255) NOT NULL,
    nip varchar(255) NOT NULL UNIQUE,
    bank varchar(255) NOT NULL,
    account_number varchar(255) NOT NULL UNIQUE,
    PRIMARY KEY (seller_id)
);

database / mysql / invoice.go

func (r *invoiceRepository) CreateSeller(seller *invoice.Seller) error {
        query := "INSERT INTO seller (name, contact, street, city, nip, bank, account_number) VALUES (?, ?, ?, ?, ?, ?, ?)"
        stmt, err := r.db.Prepare(query)
        if err != nil {
                log.Errorf("Unable to create seller %s: %v", seller.SellerName, err)
                return err
        }

        res, err := stmt.Exec(&seller.SellerName, &seller.SellerContact, &seller.SellerStreet, &seller.SellerCity, &seller.SellerNIP, &seller.SellerBank, &seller.SellerAccountNumber)
        if err != nil {
                log.Errorf("Error while creating seller: %v", err)
                return err
        }

        newID, err := res.LastInsertId()
        if err != nil {
                log.Errorf("Error while getting inserted id: %v", err)
                return err
        }

        log.Infof("Created seller %s [id=%d]", seller.SellerName, newID)
        return nil
}

现在,当我使用唯一的Seller_name发出POST请求(使用httpie)时,我的代码甚至会创建具有空列的行。看起来像这样: http POST localhost:8000/api/seller/create seller_name=testt

这是我的行在表格中的样子:

+-----------+-------+---------+--------+------+-----+------+----------------+
| seller_id | name  | contact | street | city | nip | bank | account_number |
+-----------+-------+---------+--------+------+-----+------+----------------+
|         1 | testt |         |        |      |     |      |                |
+-----------+-------+---------+--------+------+-----+------+----------------+

我不知道我在哪里犯了错误。

编辑(添加型号)

type Seller struct {
        SellerID            int64  `json:"seller_id"`
        SellerName          string `json:"seller_name"`
        SellerContact       string `json:"seller_contact"`
        SellerStreet        string `json:"seller_street"`
        SellerCity          string `json:"seller_city"`
        SellerNIP           string `json:"seller_nip"`
        SellerBank          string `json:"seller_bank"`
        SellerAccountNumber string `json:"seller_account_number"`
}

2 个答案:

答案 0 :(得分:4)

Go不会在表中插入null,而是插入空字符串。您的代码有效地做到了这一点:

seller := Seller{}
seller.SellerName = "testt"

创建要插入的seller。因此,seller中除SellerName之外的所有字段的类型均为零。造成麻烦的字段为string,而string的零值为""(即空字符串),因此SQL最终看起来像这样:

INSERT INTO seller (name, contact, ...)
VALUES ('testt', '', ...)

而且没有NULL。

您可以验证Go中的传入数据,以便拒绝空字符串,可以使用NullString代替string并让数据库处理NULL(假设MySQL正确无误)配置),或同时执行这两种操作。

答案 1 :(得分:0)

是的,因为涉及到Mysql: 空字符串(例如'')不为null。 它将其视为字符串(只能为空)。