Skip to content

Latest commit

 

History

History
executable file
·
170 lines (127 loc) · 3.12 KB

README.md

File metadata and controls

executable file
·
170 lines (127 loc) · 3.12 KB

Go-SQLite3-Dynamic

GoLang database/sql driver without CGo

This package provides an alternative to go-sqlite3 without CGo.

It relies on calls to external libraries, using either DLL syscalls on Windows, or nocgo on Linux.

This should allow really easy cross compile support when building from another OS (e.g. Linux).

Basic functionality is implemented, but it doesn't support things like user defined functions that call back to Go code.

Otherwise, usage should be the same as for go-sqlite3.

Windows

DLL Search Path

By default, we'll look for sqlite3.dll in either the same directory as your executable, or in a support folder.

You'll need sqlite3.dll to match your compiled architecture (32/64bit).

Linux

Linux support is expermimental, as nocgo's implementation of dlopen is still considered experimental.

It'll use the SQLite3 library installed on your system by the package manager.

Installing on Ubuntu

apt-get -y install libsqlite3-0

Examples

In-Memory SQLite

package main

import (
	"os"
	"fmt"

	"database/sql"

	"github.com/iamacarpet/go-sqlite3-dynamic"
)

func main() {
	resetTime := time.Now()

	fmt.Println(sqlite3.Version())

	db, err := sql.Open(`sqlite3`, "file:"+resetTime.Format("2006-01-02")+"?mode=memory&cache=shared")
	if err != nil {
		panic(err)
	}

	r, err := db.Exec(`CREATE TABLE test (
		id integer PRIMARY KEY NOT NULL,
		name varchar(30)
	)`)
	if err != nil {
		panic(err)
	}

	_ = r

	r, err = db.Exec(`INSERT INTO test(name) VALUES ('first') `)
	if err != nil {
		panic(err)
	}
	_, err = r.LastInsertId()
	if err != nil {
		panic(err)
	}
	_, err = r.RowsAffected()
	if err != nil {
		panic(err)
	}

	r, err = db.Exec(`INSERT INTO test(name) VALUES ('second') `)
	if err != nil {
		panic(err)
	}
	_, err = r.LastInsertId()
	if err != nil {
		panic(err)
	}
	_, err = r.RowsAffected()
	if err != nil {
		panic(err)
	}

	db.Close()
}

On Disk SQLite

package main

import (
	"os"
	"fmt"

	"database/sql"

	"github.com/iamacarpet/go-sqlite3-dynamic"
)

func main() {
	path := "test.db"

	f, err := os.Create(path)
	if err != nil {
		panic(err)
	}
	f.Close()

	fmt.Println(sqlite3.Version())

	db, err := sql.Open(`sqlite3`, path)
	if err != nil {
		panic(err)
	}

	r, err := db.Exec(`CREATE TABLE test (
		id integer PRIMARY KEY NOT NULL,
		name varchar(30)
	)`)
	if err != nil {
		panic(err)
	}

	_ = r

	r, err = db.Exec(`INSERT INTO test(name) VALUES ('first') `)
	if err != nil {
		panic(err)
	}
	_, err = r.LastInsertId()
	if err != nil {
		panic(err)
	}
	_, err = r.RowsAffected()
	if err != nil {
		panic(err)
	}

	r, err = db.Exec(`INSERT INTO test(name) VALUES ('second') `)
	if err != nil {
		panic(err)
	}
	_, err = r.LastInsertId()
	if err != nil {
		panic(err)
	}
	_, err = r.RowsAffected()
	if err != nil {
		panic(err)
	}

	db.Close()
	os.Remove(`./test.db`)
}