GitHub - go-goracle/goracle: Oracle driver for Go, using the ODPI-C driver
source link: https://github.com/go-goracle/goracle
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
goracle
goracle is a package which is a database/sql/driver.Driver for connecting to Oracle DB, using Anthony Tuininga's excellent OCI wrapper, ODPI-C.
At least Go 1.9 is required!
Connect
In sql.Open("goracle", connString)
, you can provide the classic "user/passw@sid"
as connString, or an URL like "oracle://user:passw@sid".
You can provide all possible options with ConnectionParams
.
Rationale
With Go 1.9, driver-specific things are not needed, everything (I need) can be
achieved with the standard database/sql library. Even calling stored procedures
with OUT parameters, or sending/retrieving PL/SQL array types - just give a
goracle.PlSQLArrays
Option within the parameters of Exec
!
The array size of the returned PL/SQL arrays can be set with goracle.ArraySize(2000)
- the default is 1024.
Connections are pooled by default (except AS SYSOPER
or AS SYSDBA
).
Speed
Correctness and simplicity is more important than speed, but the underlying ODPI-C library helps a lot with the lower levels, so the performance is not bad.
Queries are prefetched (256 rows by default, can be changed by adding a
goracle.FetchRowCount(1000)
argument to the call of Query),
but you can speed up INSERT/UPDATE/DELETE statements
by providing all the subsequent parameters at once, by putting each param's subsequent
elements in a separate slice:
Instead of
db.Exec("INSERT INTO table (a, b) VALUES (:1, :2)", 1, "a")
db.Exec("INSERT INTO table (a, b) VALUES (:1, :2)", 2, "b")
do
db.Exec("INSERT INTO table (a, b) VALUES (:1, :2)", []int{1, 2}, []string{"a", "b"})
Logging
Goracle uses github.com/go-kit/kit/log
's concept of a Log
function.
Either set goracle.Log
to a logging function globally,
or (better) set the logger in the Context of ExecContext or QueryContext:
db.QueryContext(goracle.ContextWithLog(ctx, logger.Log), qry)
Tracing
To set ClientIdentifier, ClientInfo, Module, Action and DbOp on the session, to be seen in the Database by the Admin, set goracle.TraceTag on the Context:
db.QueryContext(goracle.ContextWithTraceTag(goracle.TraceTag{
Module: "processing",
Action: "first",
}), qry)
Extras
To use the goracle-specific functions, you'll need a *goracle.conn
.
That's what goracle.DriverConn
is for!
See z_qrcn_test.go for using that to reach
NewSubscription.
Caveats
sql.NullString
sql.NullString
is not supported: Oracle DB does not differentiate between
an empty string ("") and a NULL, so an
sql.NullString{String:"", Valid:true} == sql.NullString{String:"", Valid:false}
and this would be more confusing than not supporting sql.NullString
at all.
Just use plain old string
!
NUMBER
NUMBER
s are transferred as goracle.Number
(which is a string
) to Go under the hood.
This ensures that we don't lose any precision (Oracle's NUMBER has 38 decimal digits),
and sql.Scan
will hide this and Scan
into your int64
, float64
or string
, as you wish.
For PLS_INTEGER
and BINARY_INTEGER
(PL/SQL data types) you can use int32
.
Install
Just
go get gopkg.in/goracle.v2
Or if you prefer dep
dep ensure -add gopkg.in/goracle.v2
and you're ready to go!
Note that Windows may need some newer gcc (mingw-w64 with gcc 7.2.0).
Contribute
Just as with other Go projects, you don't want to change the import paths, but you can hack on the library in place, just set up different remotes:
cd $GOPATH.src/gopkg.in/goracle.v2
git remote add upstream https://github.com/go-goracle/goracle.git
git fetch upstream
git checkout -b master upstream/master
git checkout -f master
git pull upstream master
git remote add fork [email protected]:mygithubacc/goracle
git checkout -b newfeature upstream/master
Change, experiment as you wish, then
git commit -m 'my great changes' *.go
git push fork newfeature
and you're ready to send a GitHub Pull Request from github.com/mygithubacc/goracle
, newfeature
branch.
pre-commit
Add this to .git/hooks/pre-commit
#!/bin/sh
set -e
output="$(gofmt -l "$@")"
if [ -n "$output" ]; then
echo >&2 "Go files must be formatted with gofmt. Please run:"
for f in $output; do
echo >&2 " gofmt -w $PWD/$f"
done
exit 1
fi
gometalinter --vendor --disable-all \
--enable=deadcode \
--enable=ineffassign \
--enable=gosimple \
--enable=staticcheck \
--enable=unused \
--enable=vetshadow \
--enable=maligned \
--enable=vet \
--enable=safesql \
--enable=unconvert \
--enable=gofmt \
./...
Third-party
- oracall generates a server for calling stored procedures.
Recommend
-
8
asm Introducing Oracle ASM Filter Driver Svetoslav Gyurov
-
11
Using Chrome Driver with Docker, Rails and Selenium on AWS Sep 30, 2017 I've done a lot of crawling in my professional career and I mean a lot. The recent trend towards JavaScript based sites...
-
15
Sinespace Shop Spotlight: An Avatar Facial Driver Using Your Webcam I decided today that I should visit (and blog about) a few other virtual worlds, other than Sansar. today. First stop was Sinespace, where I discovered
-
5
A Case Study Using Regression-Based Driver Analysis Make the Investment or Not? A Case Study Using Regression-Based Driver Analysis
-
5
April 14, 2021 #release Quarkus 1.13.2.Final released - Oracle JDBC driver extension, bugfixes ...
-
7
Tesla ‘driver’ arrested in California for using Autopilot while in the back seatMuch more than a case of reckless driving
-
17
Jdbc oracle driver error 17024 no data read advertisements I'm trying to run an insert to an Oracle database with an SQL statement that looks...
-
2
Using host Nvidia driver with Flatpak Aug 26, 2018 This post is going to be a bit of a deep dive into how GL driver extensions work on Flatpak, why they work the way they do, and how we can best use them moving forwa...
-
8
ConversationAccording to display drivers believed to be for the Pixel 7 Pro, there'll be a native 1080p mode exposed. Android 13 very not coincidentally has a new setting page for resolut...
-
1
Durham Police catch lorry driver using phone 'at speed'Published1 day ago
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK