首页 > 解决方案 > Go - 即使设置了 NOT NULL,MySQL 也会插入

问题描述

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

架构.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)
);

数据库/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"`
}

标签: mysqlgo

解决方案


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

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

创建seller您要插入的。seller因此,您的except中的所有字段都SellerName将具有其类型的零值;给你带来麻烦的字段是strings 并且 a 的零值string""(即一个空字符串),所以 SQL 最终看起来像:

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

并且看不到NULL。

您可以验证 Go 中的传入数据以便拒绝空字符串,您可以使用NullString而不是string让数据库处理NULLs(假设 MySQL 配置正确),或者两者都做。


推荐阅读