commit ab4a94c54735f66f13685f3dec9e95319ac14bba Author: Fabio Scotto di Santolo Date: Thu Dec 8 09:27:39 2022 +0100 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..104a116 --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,goland,go +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,goland,go + +### Go ### +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +gormdemo + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work + +### GoLand ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +auto-import. +.idea/artifacts +.idea/compiler.xml +.idea/jarRepositories.xml +.idea/modules.xml +.idea/*.iml +.idea/modules +*.iml +*.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### GoLand Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# Test database +*.db + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,goland,go \ No newline at end of file diff --git a/db/database.go b/db/database.go new file mode 100644 index 0000000..715df06 --- /dev/null +++ b/db/database.go @@ -0,0 +1,31 @@ +package db + +import ( + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +type Credential struct { + Username string + Password string +} + +type GormConfig struct { + Dsn string + Credential Credential +} + +type ConnectionFactory interface { + GetConnection(config GormConfig) (*gorm.DB, error) +} + +type SQLiteConnectionFactory struct{} + +func (f *SQLiteConnectionFactory) GetConnection(config GormConfig) (*gorm.DB, error) { + return gorm.Open(sqlite.Open(config.Dsn), &gorm.Config{}) +} + +func OpenConnection(dsn string, factory ConnectionFactory) (*gorm.DB, error) { + db, err := factory.GetConnection(GormConfig{Dsn: dsn}) + return db, err +} diff --git a/db/product.go b/db/product.go new file mode 100644 index 0000000..d14c73a --- /dev/null +++ b/db/product.go @@ -0,0 +1,9 @@ +package db + +import "gorm.io/gorm" + +type Product struct { + gorm.Model + Code string + Price uint +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ecdd439 --- /dev/null +++ b/go.mod @@ -0,0 +1,14 @@ +module gormdemo + +go 1.19 + +require ( + gorm.io/driver/sqlite v1.4.3 + gorm.io/gorm v1.24.2 +) + +require ( + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..021ee43 --- /dev/null +++ b/go.sum @@ -0,0 +1,13 @@ +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/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU= +gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= +gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.2 h1:9wR6CFD+G8nOusLdvkZelOEhpJVwwHzpQOUM+REd6U0= +gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= diff --git a/main.go b/main.go new file mode 100644 index 0000000..caa40f4 --- /dev/null +++ b/main.go @@ -0,0 +1,32 @@ +package main + +import ( + gdb "gormdemo/db" +) + +func main() { + db, err := gdb.OpenConnection("test.db", &gdb.SQLiteConnectionFactory{}) + if err != nil { + panic("failed to connect database") + } + + // Migrate the schema + db.AutoMigrate(&gdb.Product{}) + + // Create + db.Create(&gdb.Product{Code: "D42", Price: 100}) + + // Read + var product gdb.Product + db.First(&product, 1) // find product with integer primary key + db.First(&product, "code = ?", "D42") // find product with code D42 + + // Update - update product's price to 200 + db.Model(&product).Update("Price", 200) + // Update - update multiple fields + db.Model(&product).Updates(gdb.Product{Price: 200, Code: "F42"}) // non-zero fields + db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"}) + + // Delete - delete product + db.Delete(&product, 1) +}