После десятков часов попыток выяснить, как выполнить вставку BLOB в OracleDB с помощью драйвера Goracle Go, я получил ответ.
TL; DR
Полный код (очевидно, адаптируются переменные, такие как DBподключение и местоположение файла && имя файла в соответствии с вашими потребностями):
package main
import (
"bytes"
"context"
"database/sql"
"fmt"
"io/ioutil"
"time"
goracle "gopkg.in/goracle.v2"
)
func main() {
fmt.Println("... Setting up Database Connection")
testDb, err := sql.Open("goracle",
"sys" +
"/" +
"Oracle18" +
"@" +
"localhost:32118" +
"/" +
"XE as sysdba")
if err != nil {
fmt.Println("... DB Setup Failed")
fmt.Println(err)
return
}
defer testDb.Close()
// Get file as bytes
dat, err := ioutil.ReadFile("./sample.png")
if err != nil {
fmt.Println(".....Error Opening File")
fmt.Println(err)
return
}
// BLOB creation && passing file into it
directLob := goracle.Lob{ Reader: bytes.NewReader(dat[:])}
fmt.Println("\nINSERTING BLOB - starting....")
// Working BLOB insertion - INSERT COMMAND
_, err = testDb.Exec("insert into AA_LIVE_FRAMES(id, frame) VALUES(:1, :2)", 1, directLob)
if err != nil {
fmt.Println(".....Error Inserting BLOB")
fmt.Println(err)
return
}
fmt.Println("\nINSERTING BLOB - ended.")
fmt.Println("\nSuccess")
}
Это рабочий файл main.go.
ОТЛИЧНАЯ ВЕРСИЯ ОТВЕТ
Почему это заняло так много времени, если код так прост?
Когда я начал работать с этой проблемой, я не нашел ни одного учебника или примеров в документации goracle, показывающих, какВСТАВИТЬ BLOB в OracleDB. Конечно, была эта структура goracle.Lob с хорошей функцией - Read (). Это была моя первая попытка, объявить этот goracle.Lob и использовать его функцию Read (), но это дало мне ошибки - нулевой адрес и так далее. Я не знал почему, пытался его отладить - безрезультатно. Затем я углубился, вытащил несколько тестовых кодов из пакета goracle, показывающих, как создать временный большой объект - часть этого кода показана в моем ответе на вопрос. Опять без успеха. Затем я пробовал сырой SQL, но снова потерпел неудачу (я думаю, потому что мой OracleDB - это каталог для создания докеров, который необходим для вставки BLOB в OracleDB, не работал; nvm).
И, наконец, я неконечно, почему, я пробовал struct literal:
directLob := goracle.Lob{ Reader: bytes.NewReader(dat[:])}
и работал.
Хорошо, почему я все это печатаю? Потому что, AFAIK, делает это:
directLob := goracle.Lob{ Reader: bytes.NewReader(dat[:])}
и это:
directLob := goracle.Lob{}
directLob.Read(dat[:])
должно быть одинаковым? Или я совершенно не прав?