diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1872525..c73d763 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,11 +5,11 @@ version: 2 updates: - - package-ecosystem: "github-actions" - directory: "/" + - package-ecosystem: gomod + directory: / schedule: - interval: "daily" - - package-ecosystem: "gomod" - directory: "/" + interval: daily + - package-ecosystem: github-actions + directory: / schedule: - interval: "daily" + interval: daily \ No newline at end of file diff --git a/.github/workflows/badge-gorm-tests.yml b/.github/workflows/badge-gorm-tests.yml new file mode 100644 index 0000000..407892c --- /dev/null +++ b/.github/workflows/badge-gorm-tests.yml @@ -0,0 +1,52 @@ +name: Badge GORM tests + +on: + workflow_dispatch: + workflow_run: + workflows: ["GORM-tests"] + branches: [master] + types: [completed] + +jobs: + create-gorm-tests-badge: + runs-on: ubuntu-latest + steps: + - name: Download artifact + uses: dawidd6/action-download-artifact@v2 + with: + workflow: gorm-tests.yml + workflow_conclusion: completed + path: . + + - name: Prepare badge data + working-directory: Linux-1.17-tests.out + run: | + echo "tests_passed=$(cat ./*.out | grep PASS | wc -l)" >> $GITHUB_ENV + echo "tests_skipped=$(cat ./*.out | grep SKIP | wc -l)" >> $GITHUB_ENV + echo "tests_failed=$(cat ./*.out | grep FAIL | wc -l)" >> $GITHUB_ENV + + - name: Make success badge + if: ${{ env.tests_failed == '0' }} + uses: schneegans/dynamic-badges-action@v1.4.0 + with: + auth: ${{ secrets.GIST_SECRET }} + gistID: fb4d23f63d866b3e1e58b26d2f5ed01f + filename: badge-gorm-tests.json + label: GORM tests + message: "Passed: ${{ env.tests_passed }} | Failed: ${{ env.tests_failed }}" + color: 54a158 + style: for-the-badge + labelColor: 25292d + + - name: Make fail badge + if: ${{ env.tests_failed != '0' }} + uses: schneegans/dynamic-badges-action@v1.4.0 + with: + auth: ${{ secrets.GIST_SECRET }} + gistID: fb4d23f63d866b3e1e58b26d2f5ed01f + filename: badge-gorm-tests.json + label: GORM tests + message: "Passed: ${{ env.tests_passed }} | Failed: ${{ env.tests_failed }}" + color: 96232b + style: for-the-badge + labelColor: 25292d diff --git a/.github/workflows/badge-sqlite-version.yml b/.github/workflows/badge-sqlite-version.yml new file mode 100644 index 0000000..fa7d1b2 --- /dev/null +++ b/.github/workflows/badge-sqlite-version.yml @@ -0,0 +1,41 @@ +name: Badge Sqlite version + +on: + workflow_dispatch: + workflow_run: + workflows: ["GORM-tests"] + branches: [master] + types: [completed] + +jobs: + create-sqlite-version-badge: + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: 1.18 + + - name: Check out code into the Go module directory + uses: actions/checkout@v3 + + - name: go mod package cache + uses: actions/cache@v3 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-${{ hashFiles('go.mod') }} + + - name: request sqlite_version() + run: echo "sqlite_version=$(go test . -run '^TestSQLiteVersion$' -v | grep sqlite_version | tr -s ' ' | cut -d' ' -f3)" >> $GITHUB_ENV + + - name: Make version badge + uses: schneegans/dynamic-badges-action@v1.4.0 + with: + auth: ${{ secrets.GIST_SECRET }} + gistID: fb4d23f63d866b3e1e58b26d2f5ed01f + filename: badge-sqlite-version.json + label: SQLite + message: "${{ env.sqlite_version }}" + color: 2269d3 + style: for-the-badge + labelColor: 25292d diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7cc82c..94cdbd7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,21 +2,28 @@ name: CI on: push: + branches-ignore: + - 'orig' pull_request: + branches-ignore: + - 'orig' jobs: test: - name: Test strategy: matrix: - go: ['1.19', '1.18', '1.17'] - platform: [ubuntu-latest] # can not run in windows OS - runs-on: ubuntu-latest + go: ['1.19','1.18','1.17'] + platform: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.platform }} + steps: - name: Set up Go uses: actions/setup-go@v3 with: go-version: ${{ matrix.go }} + check-latest: true + - run: go version + - uses: actions/checkout@v3 - name: Test run: go test -v -cover . diff --git a/.github/workflows/gorm-tests.yml b/.github/workflows/gorm-tests.yml new file mode 100644 index 0000000..828e780 --- /dev/null +++ b/.github/workflows/gorm-tests.yml @@ -0,0 +1,72 @@ +name: GORM-tests + +on: + push: + branches-ignore: + - 'orig' + pull_request: + branches-ignore: + - 'orig' + +jobs: + # Label of the container job + gorm-test: + strategy: + matrix: + go: ['1.19','1.18','1.17'] + platform: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.platform }} + + steps: + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: ${{ matrix.go }} + check-latest: true + - run: go version + + - name: Check out this repo + uses: actions/checkout@v3 + with: + path: sqlite + + - name: Check out GORM repo + uses: actions/checkout@v3 + with: + repository: go-gorm/gorm + path: gorm + + - name: go mod package cache + uses: actions/cache@v3 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ matrix.go }}-${{ hashFiles('**/go.mod') }} + + - name: patch gorm test to use this repo as SQLite driver + working-directory: ./gorm/tests + shell: bash + # note portable syntax of sed (both GNU and BSD version work with -i.bak cheat, see https://stackoverflow.com/a/44864004 + run: | + sed -i.bak '/gorm.io\/driver\/sqlite/d' go.mod + echo "replace github.com/glebarez/sqlite => ../../sqlite/" >> go.mod + sed -i.bak 's:gorm.io/driver/sqlite:github.com/glebarez/sqlite:g' tests_test.go + go mod tidy + cat go.mod + + - name: run gorm tests + working-directory: ./gorm/tests + shell: bash + run: go test -race -v -count=1 ./... 2>&1 > ${{ runner.os }}-${{ matrix.go }}-tests.out + + - name: view failed tests result + if: ${{ failure() }} + working-directory: ./gorm/tests + shell: bash + run: grep FAIL -A10 -B3 ${{ runner.os }}-${{ matrix.go }}-tests.out || true + + - name: save tests results + if: ${{ always() }} + uses: actions/upload-artifact@v3 + with: + name: ${{ runner.os }}-${{ matrix.go }}-tests.out + path: ./gorm/tests/${{ runner.os }}-${{ matrix.go }}-tests.out diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a725465 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +vendor/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c45b3a5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "go.buildOnSave": "off" +} \ No newline at end of file diff --git a/README.md b/README.md index 7b020a4..a95b068 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,11 @@ -# GORM Sqlite Driver +![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/glebarez/fb4d23f63d866b3e1e58b26d2f5ed01f/raw/badge-gorm-tests.json) +![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/glebarez/fb4d23f63d866b3e1e58b26d2f5ed01f/raw/badge-sqlite-version.json) +
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fglebarez%2Fsqlite&count_bg=%2379C83D&title_bg=%23555555&icon=baidu.svg&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://hits.seeyoufarm.com) +# Pure-Go SQLite driver for GORM +Pure-go (without cgo) implementation of SQLite driver for [GORM](https://gorm.io/)

+This driver has SQLite embedded, you don't need to install one separately. -![CI](https://github.com/go-gorm/sqlite/workflows/CI/badge.svg) - -## USAGE - -```go -import ( - "gorm.io/driver/sqlite" - "gorm.io/gorm" -) - -// github.com/mattn/go-sqlite3 -db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{}) -``` - -Checkout [https://gorm.io](https://gorm.io) for details. - -### Pure go Sqlite Driver - -checkout [https://github.com/glebarez/sqlite](https://github.com/glebarez/sqlite) for details +# Usage ```go import ( @@ -26,5 +13,45 @@ import ( "gorm.io/gorm" ) -db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{}) +db, err := gorm.Open(sqlite.Open("sqlite.db"), &gorm.Config{}) ``` + +### In-memory DB example +```go +db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) +``` + +### Foreign-key constraint activation +Foreign-key constraint is disabled by default in SQLite. To activate it, use connection URL parameter: +```go +db, err := gorm.Open(sqlite.Open(":memory:?_pragma=foreign_keys(1)"), &gorm.Config{}) +``` +More info: [https://www.sqlite.org/foreignkeys.html](https://www.sqlite.org/foreignkeys.html) + +# FAQ +## How is this better than standard GORM SQLite driver? +The [standard GORM driver for SQLite](https://github.com/go-gorm/sqlite) has one major drawback: it is based on a [Go-bindings of SQLite C-source](https://github.com/mattn/go-sqlite3) (this is called [cgo](https://go.dev/blog/cgo)). This fact imposes following restrictions on Go developers: +- to build and run your code, you will need a C compiler installed on a machine +- SQLite has many features that need to be enabled at compile time (e.g. [json support](https://www.sqlite.org/json1.html)). If you plan to use those, you will have to include proper build tags for every ```go``` command to work properly (```go run```, ```go test```, etc.). +- Because of C-compiler requirement, you can't build your Go code inside tiny stripped containers like (golang-alpine) +- Building on GCP is not possible because Google Cloud Platform does not allow gcc to be executed. + +**Instead**, this driver is based on pure-Go implementation of SQLite (https://gitlab.com/cznic/sqlite), which is basically an original SQLite C-source AST, translated into Go! So, you may be sure you're using the original SQLite implementation under the hood. + +## Is this tested good ? +Yes, The CI pipeline of this driver employs [whole test base](https://github.com/go-gorm/gorm/tree/master/tests) of GORM, which includes more than **12k** tests (see badge on the page-top). Testing is run against latest major releases of Go: +- 1.17 +- 1.18 +- 1.19 + +In following environments: +- Linux +- Windows +- MacOS + +## Is it fast? +Well, it's slower than CGo implementation, but not terribly. See the [bechmark of underlying pure-Go driver vs CGo implementation](https://github.com/glebarez/go-sqlite/tree/master/benchmark). + +## Included features +- JSON1 (https://www.sqlite.org/json1.html) +- Math functions (https://www.sqlite.org/lang_mathfunc.html) diff --git a/go.mod b/go.mod index 039ce28..83b9c08 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,9 @@ -module gorm.io/driver/sqlite +module github.com/glebarez/sqlite -go 1.14 +go 1.16 require ( + github.com/glebarez/go-sqlite v1.19.1 github.com/jinzhu/now v1.1.5 // indirect - github.com/mattn/go-sqlite3 v1.14.15 gorm.io/gorm v1.24.0 ) diff --git a/go.sum b/go.sum index dc55f42..8b4aa11 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,79 @@ +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/glebarez/go-sqlite v1.19.1 h1:o2XhjyR8CQ2m84+bVz10G0cabmG0tY4sIMiCbrcUTrY= +github.com/glebarez/go-sqlite v1.19.1/go.mod h1:9AykawGIyIcxoSfpYWiX1SgTNHTNsa/FVc75cDkbp4M= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gorm.io/gorm v1.24.0 h1:j/CoiSm6xpRpmzbFJsQHYj+I8bGYWLXVHeYEyyKlF74= gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.38.1/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.0.0-20220910160915-348f15de615a/go.mod h1:8p47QxPkdugex9J4n9P2tLZ9bK01yngIVp00g4nomW0= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.19.0 h1:bXyVhGQg6KIClTr8FMVIDPl7jtbcs7aS5WP7vLDaxPs= +modernc.org/libc v1.19.0/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.19.1 h1:8xmS5oLnZtAK//vnd4aTVj8VOeTAccEFOtUnIzfSw+4= +modernc.org/sqlite v1.19.1/go.mod h1:UfQ83woKMaPW/ZBruK0T7YaFCrI+IE0LeWVY6pmnVms= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.14.0/go.mod h1:gQ7c1YPMvryCHCcmf8acB6VPabE59QBeuRQLL7cTUlM= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.6.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= diff --git a/sqlite.go b/sqlite.go index cb1afff..5f015b0 100644 --- a/sqlite.go +++ b/sqlite.go @@ -8,7 +8,8 @@ import ( "gorm.io/gorm/callbacks" - _ "github.com/mattn/go-sqlite3" + _ "github.com/glebarez/go-sqlite" + "gorm.io/gorm" "gorm.io/gorm/clause" "gorm.io/gorm/logger" @@ -17,7 +18,7 @@ import ( ) // DriverName is the default driver name for SQLite. -const DriverName = "sqlite3" +const DriverName = "sqlite" type Dialector struct { DriverName string diff --git a/sqlite_test.go b/sqlite_test.go index d33ea02..73da2cf 100644 --- a/sqlite_test.go +++ b/sqlite_test.go @@ -5,7 +5,7 @@ import ( "fmt" "testing" - "github.com/mattn/go-sqlite3" + sqlite "github.com/glebarez/go-sqlite" "gorm.io/gorm" ) @@ -17,20 +17,9 @@ func TestDialector(t *testing.T) { // Register the custom SQlite3 driver. // It will have one custom function called "my_custom_function". + sql.Register(CustomDriverName, - &sqlite3.SQLiteDriver{ - ConnectHook: func(conn *sqlite3.SQLiteConn) error { - // Define the `concat` function, since we use this elsewhere. - err := conn.RegisterFunc( - "my_custom_function", - func(arguments ...interface{}) (string, error) { - return "my-result", nil // Return a string value. - }, - true, - ) - return err - }, - }, + &sqlite.Driver{}, ) rows := []struct { @@ -67,16 +56,16 @@ func TestDialector(t *testing.T) { }, openSuccess: false, }, - { - description: "Explicit default driver, custom function", - dialector: &Dialector{ - DriverName: DriverName, - DSN: InMemoryDSN, - }, - openSuccess: true, - query: "SELECT my_custom_function()", - querySuccess: false, - }, + // { + // description: "Explicit default driver, custom function", + // dialector: &Dialector{ + // DriverName: DriverName, + // DSN: InMemoryDSN, + // }, + // openSuccess: true, + // query: "SELECT my_custom_function()", + // querySuccess: false, + // }, { description: "Custom driver", dialector: &Dialector{ @@ -87,16 +76,16 @@ func TestDialector(t *testing.T) { query: "SELECT 1", querySuccess: true, }, - { - description: "Custom driver, custom function", - dialector: &Dialector{ - DriverName: CustomDriverName, - DSN: InMemoryDSN, - }, - openSuccess: true, - query: "SELECT my_custom_function()", - querySuccess: true, - }, + // { + // description: "Custom driver, custom function", + // dialector: &Dialector{ + // DriverName: CustomDriverName, + // DSN: InMemoryDSN, + // }, + // openSuccess: true, + // query: "SELECT my_custom_function()", + // querySuccess: true, + // }, } for rowIndex, row := range rows { t.Run(fmt.Sprintf("%d/%s", rowIndex, row.description), func(t *testing.T) { diff --git a/sqlite_version_test.go b/sqlite_version_test.go new file mode 100644 index 0000000..663230e --- /dev/null +++ b/sqlite_version_test.go @@ -0,0 +1,23 @@ +package sqlite + +import ( + "database/sql" + "log" + "testing" +) + +func TestSQLiteVersion(t *testing.T) { + var version string + + db, err := sql.Open(DriverName, ":memory:") + if err != nil { + log.Fatal(err) + } + + row := db.QueryRow("select sqlite_version()") + if row.Scan(&version) != nil { + log.Fatal(err) + } + + t.Log(version) +}