Current collected state Current
Observed since 20 Oct, 20:37 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
5no-pg-model
JS ORM for PostgreSQL
PG ORMJS ORM for PostgreSQL
This package has moved to @5no/pg-model
@5no/pg-model requires Node version 8 or above.
npm install --save @5no/pg-model
DATABASE_URL=postgres://test:123123@127.0.0.1:5432/testDB?ssl=false
DATABASE_QUERY_LOG=true
{
table: {
schema: 'public', //database schema name
name: 'users', //table name
},
columns: { // describe columns
[name]: { // column name
type: String, // String, Number, Boolean, Date, Object, Array
primaryKey: true, // only for primaryKey
defaultValue: null, // default value
required: true, // validate values
prefilled: true, // filling field by default
schema: {}, // Can describe object schema
},
[name]: { // Auto filling column name
type: Date,
created: true, // Fill in create moment
format: 'YYYY-MM-DD HH:mm:ss', // Format date
},
[name]: { // Auto filling column name
type: Date,
updated: true, // Fill in update moment
format: 'YYYY-MM-DD HH:mm:ss', // Format date
},
},
relations: {
Info: { // name
model: UsersInfo, // model
join: {
model: Roles, // Join model
local: 'role_id', // local column
foreign: 'id', // external table field
type: 'one', // one, many
}, // join model
local: 'id', // local column
foreign: 'user_id', // external table field
type: 'one', // one, many, join
cascade: [ // cascade methods "save", "delete"
'save',
'delete',
],
}
}
}
async save(transactionMode = true, allSave = false) // Save changes
async join(data) // set changes by Json data
async setData(data) // set changes by Json data
async saveByData(data) // Save changes by Json data
async delete() // Delete entries
async toJSON() // Return to JSON format
Builder uses @5no/pg-builder
builder() // get a Builder for customing query
find(...values) // get one row by primary keys
findOne(field | [...fields], value | [...values]) // get one row by filter
findAll(field | [...fields], value | [...values], order = null, limit = null) // get all rows by filter
count(field | [...fields], value | [...values]) // get count rows
await add(data = {}) // Model data JSON
fetch(field | [...fields], value | [...values]) // get rows by filter
fetchOne(field | [...fields], value | [...values]) // get row by filter
await join(data) // Model data | Json | ID
fetch(field | [...fields], value | [...values]) // get rows by filter if type many
fetchOne(field | [...fields], value | [...values]) // get row by filter if type many
const { Manager, Model } = require('@5no/pg-model')
class Roles extends Model {
static schema = {
table: {
schema: 'public',
name: 'roles',
},
columns: {
id: {
type: String,
primaryKey: true,
defaultValue: null,
},
role: {
type: String,
defaultValue: null,
},
created_at: {
type: Date,
created: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
updated_at: {
type: Date,
updated: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
},
relations: {},
}
}
class Settings extends Model {
static schema = {
table: {
schema: 'public',
name: 'settings',
},
columns: {
id: {
type: String,
primaryKey: true,
defaultValue: null,
},
name: {
type: String,
defaultValue: null,
},
created_at: {
type: Date,
created: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
updated_at: {
type: Date,
updated: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
},
relations: {},
}
}
class UserRoles extends Model {
static schema = {
table: {
schema: 'public',
name: 'user_roles',
},
columns: {
user_id: {
type: String,
defaultValue: null,
primaryKey: true,
},
role_id: {
type: String,
defaultValue: null,
primaryKey: true,
},
},
relations: {},
}
}
class UserSetting extends Model {
static schema = {
table: {
schema: 'public',
name: 'user_setting',
},
columns: {
user_id: {
type: String,
defaultValue: null,
primaryKey: true,
},
setting_id: {
type: String,
defaultValue: null,
primaryKey: true,
},
},
relations: {},
}
}
class UsersAddresses extends Model {
static schema = {
table: {
schema: 'public',
name: 'users_address',
},
columns: {
id: {
type: String,
primaryKey: true,
defaultValue: null,
},
user_id: {
type: String,
defaultValue: null,
required: true,
},
street_name: {
type: String,
defaultValue: null,
},
postcode: {
type: String,
defaultValue: null,
},
created_at: {
type: Date,
created: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
updated_at: {
type: Date,
updated: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
},
relations: {},
}
}
class UsersInfo extends Model {
static schema = {
table: {
schema: 'public',
name: 'users_info',
},
columns: {
id: {
type: String,
primaryKey: true,
defaultValue: null,
},
user_id: {
type: String,
defaultValue: null,
required: true,
},
first_name: {
type: String,
defaultValue: null,
},
last_name: {
type: String,
defaultValue: null,
},
created_at: {
type: Date,
created: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
updated_at: {
type: Date,
updated: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
},
relations: {},
}
}
class Users extends Model {
static schema = {
table: {
schema: 'public',
name: 'users',
},
columns: {
id: {
type: String,
primaryKey: true,
defaultValue: null,
},
email: {
type: String,
required: true,
},
public_key: {
type: String,
required: true,
},
secret_key: {
type: String,
defaultValue: '',
required: true,
},
personalised: {
type: Object,
prefilled: true,
defaultValue: {
test: 100,
},
},
properties: {
type: Array,
defaultValue: [],
schema: {
name: {
type: String,
required: true,
filters: [
'lowerCase',
],
},
value: {
type: String,
required: true,
},
},
},
created_at: {
type: Date,
created: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
updated_at: {
type: Date,
updated: true,
format: 'YYYY-MM-DD HH:mm:ss',
},
},
relations: {
Info: {
model: UsersInfo,
local: 'id',
foreign: 'user_id',
type: 'one',
cascade: [
'save',
'delete',
],
},
Addresses: {
model: UsersAddresses,
local: 'id',
foreign: 'user_id',
type: 'many',
cascade: [
'save',
'delete',
],
},
Roles: {
model: UserRoles,
join: {
model: Roles,
local: 'role_id',
foreign: 'id',
type: 'many',
},
local: 'id',
foreign: 'user_id',
type: 'join',
cascade: [
'save',
'delete',
],
},
Setting: {
model: UserSetting,
join: {
model: Settings,
local: 'setting_id',
foreign: 'id',
type: 'one',
},
local: 'id',
foreign: 'user_id',
type: 'join',
cascade: [
'save',
'delete',
],
},
},
}
}
CREATE NEW ENTRY
const roleModel = new Roles()
roleModel.role = 'Admin'
await roleModel.save()
const settingModel = new Settings()
settingModel.name = 'AdminSetting'
await settingModel.save()
const testNewUser = new Users()
testNewUser.email = 'test@test.me'
testNewUser.public_key = 'test_123'
testNewUser.secret_key = 'test_333'
testNewUser.properties = [
{
name: 'Test',
value: 'OK',
},
]
await testNewUser.Addresses.add({
street_name: 'Test',
postcode: '100500',
})
await testNewUser.Addresses.add({
street_name: 'Test1',
postcode: '100502',
})
testNewUser.Info.first_name = 'Aleks2'
testNewUser.Info.last_name = 'Sokol2'
await testNewUser.Roles.join(roleModel.id)
await testNewUser.Setting.join(settingModel)
const returnData = await testNewUser.save()
/*
If all correct function return boolean "true" otherwise array errors
Error: [
'duplicate key value violates unique constraint "users_email_index"',
]
*/
BUILDER
const builder = await Manager.build(Users).builder()
builder.select().where('id', '=', usersNewId)
const data = await builder.rows()
GET
const dataJson = await Manager.build(Users, true).find(usersId)
return
{
id: '7852468e-ac99-4f5e-9ee3-d506b0c4424e',
secret_key: 'test_333',
email: 'test@test.me',
public_key: 'test_123',
created_at: '2018-12-20 17:10:31',
updated_at: '2018-12-20 17:10:31',
personalised: {
test: 100
},
properties: [
{
name: 'test',
value: 'OK',
},
],
Info:
{ id: '0320dc4f-4ca7-4b65-bd42-52f286a0b9db',
user_id: '7852468e-ac99-4f5e-9ee3-d506b0c4424e',
first_name: 'Aleks2',
last_name: 'Sokol2',
created_at: '2018-12-20 17:10:31',
updated_at: '2018-12-20 17:10:31' },
Addresses:
[
{ id: 'be40ccb3-3a33-4b6e-9467-6907b0c4396b',
user_id: '7852468e-ac99-4f5e-9ee3-d506b0c4424e',
street_name: 'Test',
postcode: '100500',
created_at: '2018-12-20 17:10:31',
updated_at: '2018-12-20 17:10:31' },
{ id: 'f5bae3e9-290b-451e-a0e2-1ec2d9eaf543',
user_id: '7852468e-ac99-4f5e-9ee3-d506b0c4424e',
street_name: 'Test1',
postcode: '100502',
created_at: '2018-12-20 17:10:31',
updated_at: '2018-12-20 17:10:31' }
],
Roles: [
{
created_at: '2018-12-20 17:10:31',
id: 'be40ccb3-3a33-4b6e-9467-6907b0c4396b',
role: 'Admin',
updated_at: '2018-12-20 17:10:31'
}
],
Setting: {
created_at: '2018-12-20 17:10:31',
id: 'be40ccb3-3a33-4b6e-9467-6907b0c4396b',
name: 'AdminSetting',
updated_at: '2018-12-20 17:10:31'
}
}
UPDATE
let data = await Manager.build(Users).find(usersId)
let oneAddresses = data.Addresses.fetchOne('street_name', 'Test1')
oneAddresses.postcode = '100508'
data.Info.last_name = 'Sokol200'
data.secret_key = 'test_33309'
await data.save()
SAVE BY DATA
const testNewUser = new Users()
const newData = {
email: 'test2010@test.me',
public_key: 'test_123',
secret_key: 'test_333',
personalised: {
test: 100,
},
Addresses: [{
street_name: 'Test 100',
postcode: '100501',
}]
}
const returnData = await testNewUser.saveByData(newData)
DELETE
let data = await Manager.build(Users).find(usersId)
await data.delete()
/*
If all correct function return boolean "true" otherwise array errors
*/
DELETE ONE ITEM FROM RELATE
let data = await Manager.build(Users).find(usersId)
let dataDel = data.Roles.fetchOne('role', 'Admin')
await dataDel.delete()
MIT Licensed, Copyright (c) 2018 Aleksandr Sokol
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
5no-pg-builderEnvironment{
"local_name": "5no-pg-builder",
"alias": false,
"peer_metadata": null
} | ^1.0.9 | runtime |
5no-schemaEnvironment{
"local_name": "5no-schema",
"alias": false,
"peer_metadata": null
} | ^1.1.7 | runtime |
babel-cliEnvironment{
"local_name": "babel-cli",
"alias": false,
"peer_metadata": null
} | ^6.26.0 | development |
babel-coreEnvironment{
"local_name": "babel-core",
"alias": false,
"peer_metadata": null
} | ^6.26.0 | development |
babel-eslintEnvironment{
"local_name": "babel-eslint",
"alias": false,
"peer_metadata": null
} | ^10.0.1 | development |
babel-plugin-transform-runtimeEnvironment{
"local_name": "babel-plugin-transform-runtime",
"alias": false,
"peer_metadata": null
} | ^6.23.0 | development |
babel-polyfillEnvironment{
"local_name": "babel-polyfill",
"alias": false,
"peer_metadata": null
} | ^6.26.0 | development |
babel-preset-es2015Environment{
"local_name": "babel-preset-es2015",
"alias": false,
"peer_metadata": null
} | ^6.24.1 | development |
babel-preset-stage-0Environment{
"local_name": "babel-preset-stage-0",
"alias": false,
"peer_metadata": null
} | ^6.24.1 | development |
chaiEnvironment{
"local_name": "chai",
"alias": false,
"peer_metadata": null
} | ^4.2.0 | development |
eslintEnvironment{
"local_name": "eslint",
"alias": false,
"peer_metadata": null
} | ^4.0.0 | development |
eslint-config-standardEnvironment{
"local_name": "eslint-config-standard",
"alias": false,
"peer_metadata": null
} | ^11.0.0 | development |
eslint-plugin-importEnvironment{
"local_name": "eslint-plugin-import",
"alias": false,
"peer_metadata": null
} | ^2.8.0 | development |
eslint-plugin-nodeEnvironment{
"local_name": "eslint-plugin-node",
"alias": false,
"peer_metadata": null
} | ^7.0.1 | development |
eslint-plugin-promiseEnvironment{
"local_name": "eslint-plugin-promise",
"alias": false,
"peer_metadata": null
} | ^4.0.0 | development |
eslint-plugin-standardEnvironment{
"local_name": "eslint-plugin-standard",
"alias": false,
"peer_metadata": null
} | ^3.0.0 | development |
mochaEnvironment{
"local_name": "mocha",
"alias": false,
"peer_metadata": null
} | ^5.2.0 | development |
sinonEnvironment{
"local_name": "sinon",
"alias": false,
"peer_metadata": null
} | ^7.2.2 | development |
sinon-chaiEnvironment{
"local_name": "sinon-chai",
"alias": false,
"peer_metadata": null
} | ^3.3.0 | development |
Source distribution
{
"integrity": "sha512-HzwhEd3luW8dJtlnM2mTJU8gNtIVbBV7Byosya1veNLYpeN8U7SViOaxtYOOLI/aBCZ1MUjlZJ4DQ3rLtG81qw==",
"shasum": "44cde2f4d4abc39a08f928e48e6ae7b6a4b79731",
"tarball": "https://registry.npmjs.org/5no-pg-model/-/5no-pg-model-1.1.6.tgz",
"fileCount": 22,
"unpackedSize": 118067,
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLzSlCRA9TVsSAnZWagAAVgEP/1uHOscUHZMV2OT0fu2H\nbjaEm0rP6UEvCiyJgrA7R7VePOwEzuvSwKWSxXPNnfOxtFFfwWPKlArKqmeJ\n3w9u1homYI5eRzsxq1wBQ7PHT+YbInLCilBxT67DZN2//cffOdwVc+fSJlwP\nFfS/PkaSaN/idJIhfCNWX2iOkvjB2K6ZfFcMjGagJvlxTTkIEF7tkjHB679t\nOIkeCtBbJnQLGjWsLc7FmefW5TiS4Yqb49nGGKKLIIH6ShmoQsUJfwoiNE/4\nHElmfRQNfCb8qmZKvQF6hMpKyS/HDLoVjkIVANurZbFpqDNCxPeyUE7PwKTm\nvThGha4qAnN62bv5H/JAERn+TNN4BOk1FXfoFjpvoJBu2O9zFc+Vipf4jIRr\nMd1GxToo1UInZ8yIWgErznhnzbU5OPyYhhl0KpM0l9G/yVAUSOYy9qz/KPbP\n53jRHsnumkU9v94XvVkcHgUP1TPSoeWyBqkbLwmIgIIqrhJcqiExuF6LKaot\nBGn/Nbzv/v7rnpNARutPvfnZPeISCoXQon5dnEIK3bVvhTXkPxoRxiKWqm7f\ny9KjOi04ky4FwRgrXed1p3kyVSBpdCGhXhma0K8Of0XGHldl/iLRqfYBCZQr\nFYG7RMsa8LV0bY4pE+Au591cN5wY9Mu9/aHVj2Ehr4MtFRQs6pawV5GtvUJh\n4bQq\r\n=PUdI\r\n-----END PGP SIGNATURE-----\r\n",
"signatures": [
{
"keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA",
"sig": "MEYCIQDFW8Bde1jJWX7wHSAnrn46AzPQONA6TreUR/RiLe4HUQIhALXwUn+F9w/FWTSKEeBqop17hhf2BrCMwLOIJMQpPI+h"
}
]
}Observed since 20 Oct, 20:37 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:7cd4e6d5bf01640d162a46f6827f9db2f8c22a2d2acf1c2ae4de33cdf3eb0569