Go - MySQL вставляет, даже если установлен NOT NULL - PullRequest
0 голосов
/ 01 мая 2019

Я пишу простой API на Go, используя MySQL, но мой код MySQL вставляет данные в строку, даже если столбец установлен на NOT NULL. Вот мой код:

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)
);

базы данных / 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
}

Теперь, когда я делаю POST-запрос (используя httpie) только с именем seller_name, мой код создает строки даже с нулевыми столбцами. Это выглядит так: 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 ]

4 голосов
/ 01 мая 2019

Go не вставляет null s в вашу таблицу, он вставляет пустые строки. Ваш код эффективно делает это:

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

для создания seller, который вы вставляете. Таким образом, все поля в вашем seller кроме SellerName будут иметь нулевое значение для их типа; поля, вызывающие у вас проблемы, равны string с, а нулевое значение string равно "" (т. е. пустая строка), поэтому SQL в конечном итоге выглядит следующим образом:

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

и в поле зрения нет NULL.

Вы можете проверить входящие данные в Go, чтобы пустые строки были отклонены, вы могли бы использовать NullString вместо string и позволить базе данных работать с NULL s (при условии, что MySQL правильно настроен), или выполните оба действия.

0 голосов
/ 17 мая 2019

Да, потому что когда дело доходит до Mysql: строка emtpy (например, '') НЕ является нулевой. Это воспринимается как строка (только пустая).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...