@@ 5438,6 5438,61 @@ w := io.MultiWriter(os.Stdout, f)
logger := log.New(w, "MultiWriter loggger", log.LstdFlags)
#+end_src
+** SQLite Production Configuration :database:go:
+:PROPERTIES:
+:EXPORT_DATE: 2023-07-19
+:EXPORT_FILE_NAME: sqlite-production-configuration
+:EXPORT_HUGO_SLUG: sqlite-production-configuration
+:END:
+
+/Notes taken from [[https://github.com/benbjohnson][Ben Johnson’s]] talk [[https://www.youtube.com/watch?v=XcAYkriuQ1o][Building Production Applications
+Using Go & SQLite]]./
+
+The complete list of pragmas can be found on [[https://www.sqlite.org/pragma.html#pragma_foreign_keys][SQLite’s official
+website]].
+
+- Journal Mode :: Journal mode configures how SQLite writes
+ transactions. You almost always want it as *WAL* (write ahead log).
+
+ #+begin_src sql
+ PRAGMA journal_mode = WAL;
+ #+end_src
+
+- Busy timeout :: Busy timeout sets how long write transactions will
+ wait to start. If unset, writes will fail immediately if another
+ write is running. Five seconds might be enough... most of the times.
+
+ #+begin_src sql
+ PRAGMA busy_timeout = 5000;
+ #+end_src
+
+- Foreign Keys :: Believe it or not, for historical reasons foreign
+ keys are not enforced by default
+
+ #+begin_src sql
+ PRAGMA foreign_keys = ON;
+ #+end_src
+
+*** Usage in Go
+
+This is a [[https://go.dev][Go]] example showing how to use the options above with the
+[[https://github.com/mattn/go-sqlite3][github.com/mattn/go-sqlite3]] driver.
+
+#+begin_src go
+db, err := sql.Open(
+ "sqlite3",
+ "file.db?_busy_timeout=5000&_journal_mode=WAL&_foreign_keys=on",
+)
+if err != nil {
+ log.Fatalln("could not open database: %w", err)
+}
+defer func() {
+ if err := db.Close(); err != nil {
+ log.Fatalln("could not close database: %w", err)
+ }
+}()
+#+end_src
+
* Footnotes
[fn:48] [[https://www.polyml.org/][Poly/ML]] exposes a function that does just that: [[https://www.polyml.org/documentation/Reference/PolyMLStructure.html#print][PolyML.print]].