I'm writing simple API in Go using MySQL but my MySQL code inserts data to row even the column is set to NOT NULL. Here is my code:
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
}
Now when I'm making a POST request (using httpie) with the only seller_name my code creates row even with null columns. It looks like this:
http POST localhost:8000/api/seller/create seller_name=testt
Here is how my row looks in table:
+-----------+-------+---------+--------+------+-----+------+----------------+
| seller_id | name | contact | street | city | nip | bank | account_number |
+-----------+-------+---------+--------+------+-----+------+----------------+
| 1 | testt | | | | | | |
+-----------+-------+---------+--------+------+-----+------+----------------+
I don't know where I've made a mistake.
EDIT (added model)
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"`
}
SELECT @@sql_mode;? and paste it here..STRICT_TRANS_TABLESsee without and withCreateSellerfunction.selleractually look like, are the fields populated (remember: empty strings are not nil/NULL values)? More over: you create a prepared statement, but that resource is never closed, after the error check onr.db.Prepare(), add adefer stmt.Close(), please.+--------------------------------------------+ | @@sql_mode | +--------------------------------------------+ | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+