The advanced but unofficial SQLite3 Connector Module for the LoopBack Framework.
Unlike the official, this module provides full support for e.g auto-migrate, auto-upgrade and model discovery. (please see Features)
- auto-migrate and auto-update for tables, indexes, foreign keys
- model discovery
- full control over the names for tables, fields, indexes and foreign key constraints in the mapped database schema
- connection pool
- all other features provided by sqlite3orm
for loopback 3 it is recommended to use:
npm install loopback-connector-sqlite3x@<2.0 --save
for loopback 4 please use:
npm install loopback-connector-sqlite3x --save
lb4 datasource test
? Select the connector for test: other
? Enter the connectors package name: loopback-connector-sqlite3x
create src/datasources/test.datasource.json
create src/datasources/test.datasource.ts
update src/datasources/index.ts
Datasource Test was created in src/datasources/
adjust src/datasources/test.datasource.json:
{
"name": "test",
"connector": "loopback-connector-sqlite3x",
"file": "test.db",
"poolMin": 2
}
export interface Sqlite3AllSettings {
/**
* [file=shared memory] - The database file to open
*/
file: string;
/**
* [mode=SQL_OPEN_DEFAULT] - The mode for opening the database file
* A bit flag combination of:
* SQL_OPEN_CREATE,
* SQL_OPEN_READONLY,
* SQL_OPEN_READWRITE
* SQL_OPEN_DEFAULT = SQL_OPEN_CREATE | SQL_OPEN_READWRITE
*/
mode: number;
/**
* [min=1] - Minimum connections which should be opened by the connection pool
*/
poolMin: number;
/*
* [max=0] - Maximum connections which can be opened by this connection pool
*/
poolMax: number;
/*
* [debug=false] - enable debug
*/
debug: boolean;
/*
* [lazyConnect=false] - enable lazy connect
*/
lazyConnect: boolean;
/*
* [schemaName='main'] - the default schema
*/
schemaName: string;
/*
* [dbSettings]
*/
dbSettings: SqlDatabaseSettings;
/*
* [propertyValueForNULL=undefined] - the property value if column value is NULL
*/
propertyValueForNULL: any;
/*
* [implicitAutoincrementByDefault=false] - use autogenerated ROWIDs instead of using AUTOINCREMENT keyword explicitly
*/
implicitAutoincrementByDefault: boolean;
}
/*
* additional database settings
*
* for a description of the pragma setting see: https://www.sqlite.org/pragma.html
* for a description of the execution mode see: https://github.com/TryGhost/node-sqlite3/wiki/Control-Flow
*
* defaults:
* journalMode 'WAL'
* busyTimout = 3000
* readUncommitted = 'FALSE
* executionMode = 'PARALLELIZE'
*/
export interface SqlDatabaseSettings {
/*
* PRAGMA schema.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF
* for multiple schemas use e.g [ 'temp.OFF', 'main.WAL' ]
*/
journalMode?: string|string[];
/*
* PRAGMA busy_timeout = milliseconds
*/
busyTimeout?: number;
/*
* PRAGMA schema.synchronous = OFF | NORMAL | FULL | EXTRA;
* for multiple schemas use e.g [ 'temp.OFF', 'main.FULL' ]
*/
synchronous?: string|string[];
/*
* PRAGMA case_sensitive_like = TRUE | FALSE
*/
caseSensitiveLike?: string;
/*
* PRAGMA foreign_keys = TRUE | FALSE
*/
foreignKeys?: string;
/*
* PRAGMA ignore_check_constraints = TRUE | FALSE
*/
ignoreCheckConstraints?: string;
/*
* PRAGMA query_only = TRUE | FALSE
*/
queryOnly?: string;
/*
* PRAGMA read_uncommitted = TRUE | FALSE
*/
readUncommitted?: string;
/*
* PRAGMA recursive_triggers = TRUE | FALSE
*/
recursiveTriggers?: string;
/*
* PRAGMA schema.secure_delete = TRUE | FALSE | FAST
* for multiple schemas use e.g [ 'temp.OFF', 'main.FAST' ]
*/
secureDelete?: string|string[];
/*
* SERIALIZE | PARALLELIZE
*/
executionMode?: string;
/*
* PRAGMA cipher_compatibility = 1 | 2 | 3 | 4
* see: https://www.zetetic.net/sqlcipher/sqlcipher-api/#cipher_compatibility
* only available if node-sqlite3 has been compiled with sqlcipher support
* see: https://github.com/gms1/node-sqlite3-orm/blob/master/docs/sqlcipher.md
*/
cipherCompatibility?: number;
/*
* PRAGMA key = 'passphrase';
* see: https://www.zetetic.net/sqlcipher/sqlcipher-api/#PRAGMA_key
* only available if node-sqlite3 has been compiled with sqlcipher support
* see: https://github.com/gms1/node-sqlite3-orm/blob/master/docs/sqlcipher.md
*/
key?: string;
}
You can use the 'sqlite3x' property to specify additional database-specific options for a LoopBack model (see Sqlite3ModelOptions).
@model({
settings: {
sqlite3x: {
tableName: 'MyTableName',
withoutRowId: true // default: false
},
},
})
You can use the 'sqlite3x' property to specify additional database-specific options for a LoopBack property (see Sqlite3PropertyOptions).
@property({
type: 'date',
required: true,
sqlite3x: {
columnName: 'MyColumnName',
dbtype: 'INTEGER NOT NULL',
dateInMilliSeconds: false // default: true
}
})
myPropertyName: Date;
LoopBack type | Database type |
---|---|
Number | INTEGER if primary key, REAL otherwise |
Boolean | INTEGER 1 or 0 |
Date | INTEGER milliseconds since Jan 01 1970 |
String | TEXT |
JSON / Complex types | TEXT in JSON format |
you can define indexes using the loopback 'indexes' property in the standard or shortened form, as well as using the MySql form
@model({
settings: {
indexes: {
myIndex1: { // MySql form
columns: 'col1,col2',
kind: 'unique'
},
myIndex2: { // standard form
keys: {
col1: 1, // ascending
col2: -1, //descending
},
options: {
unique: true,
}
},
myIndex3: { // shortened form
col1: 1, // ascending
col2: -1, //descending
}
}
},
})
NOTE: specifying indexes at the model property level is not supported
It seems there is no standard way to define database-specific foreign key constraints using loopback, therefore a new way has been introduced: You can define foreign keys using a 'foreignKeys' property
"foreignKeys": {
"<constraint identifier>": {
"properties": "<property key>[,<property key>]...",
"refTable": "<table identifier>",
"refColumns": "<column identifier>[,<column identifier>]...",
}
}
loopback-connector-sqlite3x is licensed under the Artistic License 2.0: LICENSE