Vitalii
а можешь сслыки с примерами накидать?
Ну пример простой. Вот так подключаемся к базе:
package models
import (
"database/sql"
"fmt"
"github.com/sirupsen/logrus"
_ "gopkg.in/goracle.v2"
)
var db *sql.DB
func ConnectDB() (*sql.DB, error) {
var err error
dataSourceName := fmt.Sprintf("%s/%s@%s", config.C.Database.User, config.C.Database.Password, config.C.Database.DataSource)
db, err = sql.Open(config.C.Database.Type, dataSourceName)
if err = db.Ping(); err != nil {
return nil, err
}
logrus.Info("Database connection has been established")
return db, err
}
Vitalii
Вот делаем простой инсерт
func InsertHoiTin(req S11Request) error {
query := fmt.Sprintf("INSERT INTO %s.HTLT_HOITIN (TT, NGAYHOI, MSPHIEU, LOAI, MACIC, TENKH, SOCMT, MATCTD, MASP, FECDELIVERY) VALUES (:1, TO_DATE(:2, 'YYYY-MM-DD HH24:MI:SS'), :3, :4, :5, :6, :7, :8, :9, :10 )", config.C.DatabasePrefix)
var params []interface{}
params = append(params, *req.Status)
params = append(params, time.Now().UTC().Format("2006-01-02 15:04:05"))
params = append(params, req.Sys.Unid)
params = append(params, req.Type)
params = append(params, req.CICCode)
params = append(params, req.ClientName)
params = append(params, req.NationalID)
params = append(params, req.FECCICCode)
params = append(params, req.ProductCode)
params = append(params, req.FECDelivery)
_, err := db.Exec(query, params...)
return err
}
Vitalii
Компиляция кода происходит вот в таком контейнере:
FROM golang
LABEL vendor="Vitalii Sharavara"
LABEL description="Golang and Oracle instant client 12.2"
RUN mkdir -p /opt/oracle/
COPY /resources/instantclient_12_2/ /opt/oracle/instantclient_12_2/
ENV LD_LIBRARY_PATH /opt/oracle/instantclient_12_2
ENV ORACLE_HOME /opt/oracle/instantclient_12_2
RUN apt-get update &&\
apt-get install libaio1 &&\
apt-get clean
RUN go get gopkg.in/goracle.v2
🏁Александр
ой все...
Kirill
Michael
Алексей
Уважаемые знатоки, помогите с такой проблемкой пожалуйста:
type A struct {
...
}
type B struct {
...
}
type C struct {
...
}
func Some(someStruct ){
var asd []someStruct
...
return asd
}
a := Some(A)
b := Some(B)
c := Some(c)
как правильно в функцию переда struct ?
Anonymous
Anonymous
type ISome interface ...
Sebor▂▅▇█▓▒░
Andrei 🦉
Andrey
Как go знает сколько памяти выделять под string?
Alexander
https://blog.golang.org/slices
Andrey
То есть если есть struct у которого есть стринговое поле, размер этого стракта будет разный взависимости от того что впихнули в стринг? Или это поле будет поинтером ведущим на аррей который хранится где-то отдельно в памяти?
Alexander
Это поле - структура фиксированного размера, одно из полей которой - указатель на буфер, который уже может быть разной длины у разных строк
Andrey
понял, спасибо
Anonymous
Поинтер всегда фиксированного размера (4 или 8 байт в зависимости от архитектуры), а вот данные на которые он указывает могут быть уже любого размера.
Vladimir
Andrey
Ага, проверил сейчас с помощью unsafe.Sizeof, действительно 8 байт занимает struct, как бы ещё померить сколько занимает struct + все данные одним вызовом, а не по отдельности через len(struct.field)
Alexander
func (item *MyType) Length() int64 { .... } :)
Alexander
А для чего такое нужно?
Andrey
Просто ради интереса :) Наткнулся тут на сайтик интересный http://golang-sizeof.tips/
Алексей
Уважаемые знатоки, есть вопрос...
type A struct {
Perinods []string
}
type B struct {
A
...
}
type C struct {
A
...
}
func Some(someStruct A){
var asd []someStruct
...
return asd
}
b := Some(B)
c := Some(C)
Возможно ли сказать функции, что в аргументы на принимает любую структуру, в которой есть A ? как сложно это объяснить не в терминах ооп -_-
Илья
зачем?
Илья
что вы хотите сделать с []someStruct?
Aleksandr
Алексей
в терминах ооп, мне нужно как аргумент принимать любого наследника А
Aleksandr
а сейчас не принимает?
Aleksandr
работай с интерфейсами
Илья
если ты собираешься дальше работать только с методами A, то их можно реализовать (допустим GetPerinods) назвать интерфейс Perinoder, и потом собирать массив, итерироваться и делать что хочешь
Алексей
зачем мне нужно...
У меня есть несколько структур которые отличаются внутренностями, но у них всех есть одиннаковое поле, и мне надо принимать на вход любую из этих структур что бы работать с этим параметром, причем мне надо создавать срез точно таких же структур при работе функции
Мерль
Aleksandr
Илья
сделай метод, возвращающий поле
Илья
как я писал выше 🙂
Алексей
эх... понятно...
Мерль
Чтобы получить конкретные типы внутри интерфейса используй type switch
Nikita
эх... понятно...
Никакой тайпсвитч не нужен. Канонично делать просто так:
https://play.golang.org/p/OhPdyAI4bOZ
Алексей
🎉
Люди, как найти ошибку которую редактор не видит. Выполняю скрипт, он ругается на синтаксическую ошибку. Редактор в упор не видит где, и не подсвечивает. Есть какие-нибудь трюки, модули может? Редактор Atom.
Эмин
Поставь GoLand
Эмин
Он увидет
🎉
Он увидет
Во, точно, у меня стоит, щас гляну.
🎉
Он увидет
И он не видит))
2018/01/26 06:05:52 near ")": syntax error
Process finished with exit code 1
Anonymous
А компилятор номер строки выдаёт?
🎉
Неа. Вот хз как искать, понятно где-то ошибка, вот как найти?
Anonymous
Кидай полный вывод компилятора, чо та падазрительна!
🎉
Нашёл, щас ошибку покажу.
Slava
Может это парсер какой или шаблонизатор
🎉
func InsertUser(db *sql.DB, p *DATA) (lastID int64, err error) {
stmt, err := db.Prepare("INSERT INTO data (ChatID, MessageID, StateWhat, PathWhere, ) VALUES (?, ?, ?, ?)")
Запятую оставил после PathWhere,
🎉
И ни один редактор не заругался, компилятор не увидел.
Anonymous
Ну так это sql с чего бы им ругаться
🎉
Понятно, значит надо поаакуратнее с SQL.
🎉
А что подразумевается под контекстом? https://golang.org/pkg/database/sql/#DB.QueryContext
Anonymous
QueryRowContext executes a query that is expected to return at most one row. QueryRowContext always returns a non-nil value. Errors are deferred until Row's Scan method is called. If the query selects no rows, the *Row's Scan will return ErrNoRows. Otherwise, the *Row's Scan scans the first selected row and discards the rest.
Anonymous
Так вот же
🎉
Иэээх, было бы на русском.))
Anonymous
В гугл транслэйт загони
Anonymous
😂
Anonymous
𝒦𝒶𝓁𝒶𝓎⛩
Slach
Всем привет
а есть способ из var db *sql.DB или из var DSN string вытащить имя базы данных?
просто проблема в том, что СУБД разные в sqlite "имя базы данных" вообще отсутсвтует как класс
а в clickhouse например может задаваться с именем кластера
есть https://github.com/xo/dburl
но он наружу выдает в основном url.Path наружу... а его в CREATE DATABASE IF NOT EXISTS не пришить
Anonymous
Anonymous
И с какой БД работаешь? В гугле вижу есть решения для sqlserver и postgres.
Artem
https://golanglibs.com/top?q=dsn
Artem
вот немножно пригорает от терминологии... почему в Гоше делегирование метода называют встраиванием? ну ведь проще было сказать так, как привычно всем, зачем путать то.
Slach
Aleksandr
Slach
DSN кодируется а-ля URL
из этого URL
protocol+transport://user:password@host:port/вот тут в разных субд РАЗНОЕ!!
Igor
Aleksandr