Как заполнить таблицу в Postgresql данными, получаемыми от клиента через Postman? (Язык Go)
На интернет-ресурсах видел много разных способов как можно заполнить таблицу данными, которые мы записываем сами, но совсем не вижу способов, как сделать автозаполнение таких таблиц.
Например, у меня есть таблица Products, 3 столбца (название, вес, объем)
В Postman я отправляю Post запрос в json название, вес и объем и мне нужно, чтобы эти данные сами вписались в таблицу на Postgreql. Как можно это сделать? Заранее спасибо
type (
BlockRequest struct {
MerchantID string `json:"merchantID"`
MerchantContractID int `json:"merchantContractID"`
Card Card `json:"card"`
Amount int `json:"amount"`
OrderID string `json:"orderID"`
}
func (br BlockRequest) GetData() error {
//connect...
connStr := "user=postgres password=йцукен7 dbname=payment sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
panic(err)
}
defer db.Close()
//добавление...
result, err := db.Exec("insert into merchants (merchant_id, merchant_contract_id, order_id) values ($0, $1, $2)",
br.MerchantID, br.MerchantContractID, br.OrderID)
if err != nil {
panic(err)
}
fmt.Println(result.LastInsertId()) // не поддерживается
fmt.Println(result.RowsAffected())
// запрос инфы...
rows, err := db.Query("select * from merchants")
if err != nil {
panic(err)
}
defer rows.Close()
merchants := []BlockRequest{}
//просмотр строк...
for rows.Next() {
b := BlockRequest{}
err := rows.Scan(&b.MerchantID, &b.MerchantContractID, &b.OrderID)
if err != nil {
fmt.Println(err)
continue
}
merchants = append(merchants, b)
}
for _, b := range merchants {
fmt.Println(b.MerchantID, b.MerchantContractID, b.OrderID)
}
return nil
}
Ответы (1 шт):
Автор решения: Senior Pomidor
→ Ссылка
я не смог бы дать точный ответ что у вас не работает. Поэтому решил написать для вас пример.
создаем таблицу с пользователями
create table users
(
id int
constraint users_pk
primary key,
name varchar(32),
age int
);
вот весь рабочий код
package main
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
_ "github.com/lib/pq"
)
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
func JSONError(w http.ResponseWriter, err error, bcode string, code int) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Content-Type-Options", "nosniff")
w.WriteHeader(code)
// nolint: errcheck
json.NewEncoder(w).Encode(struct {
Code string
Message string
}{
Code: bcode,
Message: err.Error(),
})
}
func (u *User) Save() {
// connect...
connStr := "user=user password=password dbname=metrics sslmode=disable port=5432 host=localhost"
db, err := sql.Open("postgres", connStr)
if err != nil {
panic(err)
}
defer db.Close()
// добавление...
// returning id вернет нужный ID для этого row.
// так уж получилось, что я сам задаю этот ID. но вы можете использовать автоинкримент
lastInsertId := 0
err = db.QueryRow("insert into users (id, name, age) values ($1, $2, $3) returning id",
u.Id, u.Name, u.Age).Scan(&lastInsertId)
if err != nil {
panic(err)
}
}
func (u *User) List() []User {
// connect...
connStr := "user=user password=password dbname=metrics sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
panic(err)
}
defer db.Close()
rows, err := db.Query("select * from users")
if err != nil {
panic(err)
}
defer rows.Close()
users := []User{}
// просмотр строк...
for rows.Next() {
u := User{}
err := rows.Scan(&u.Id, &u.Name, &u.Age)
if err != nil {
fmt.Println(err)
continue
}
users = append(users, u)
}
for _, u := range users {
fmt.Println(u.Id, u.Name, u.Age)
}
return users
}
func myHandler(rw http.ResponseWriter, request *http.Request) {
var user User
err := json.NewDecoder(request.Body).Decode(&user)
if err != nil {
JSONError(rw, fmt.Errorf("cannot unmarshal user: %w", err), "custom_code", http.StatusUnprocessableEntity)
return // завершаем выполнение
}
user.Save()
listOfAllUsers := user.List()
response := struct {
Users []User
}{
listOfAllUsers,
}
err = json.NewEncoder(rw).Encode(&response)
if err != nil {
// тут уже вам решать, что сделать надо
JSONError(rw, fmt.Errorf("cannot unmarshal response: %w", err), "custom_code2", http.StatusInternalServerError)
return
}
// запишем новый статус в ответ.
rw.WriteHeader(http.StatusCreated)
// а если дошли сюда - это значит, что все хорошо. завершаем
}
func main() {
http.HandleFunc("/users", myHandler)
http.ListenAndServe(":8080", nil)
}
запускаем приложение и тестируем
➜ ~ curl -X POST 'http://127.0.0.1:8080/users' \
-H 'Content-Type: application/json' \
--data-raw '{
"id": 56,
"name": "user56",
"age": 156
}' | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 234 100 180 100 54 3600 1080 --:--:-- --:--:-- --:--:-- 4680
{
"Users": [
{
"id": 1,
"name": "user1",
"age": 10
},
{
"id": 2,
"name": "user1",
"age": 10
},
{
"id": 3,
"name": "user1",
"age": 10
},
{
"id": 5,
"name": "user5",
"age": 15
},
{
"id": 56,
"name": "user56",
"age": 156
}
]
}