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.8 | runtime |
5no-schemaEnvironment{
"local_name": "5no-schema",
"alias": false,
"peer_metadata": null
} | ^1.1.3 | 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-GqGHsM0KfMJ6Ft1haOzB6WAqj6A5s7eF8Oo2Y8NlCIdN3jcpepfAHKte0pUOWf6nsOvb8xkr02jf5UsDFwM2ug==",
"shasum": "ea89de39d1e3d585794af49b90042c00577db4e1",
"tarball": "https://registry.npmjs.org/5no-pg-model/-/5no-pg-model-1.1.1.tgz",
"fileCount": 23,
"unpackedSize": 261956,
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3IDLCRA9TVsSAnZWagAAoo4P/i/bKcaviVVJsRsgJwwX\nRqHRyUpXa2G1P+lR1bBTzb1zv2Nh9s2q0hO4NeNP30l7Kw7QA/Sti7mT865/\nSGHB1iCM2u70Xqb7/K6jfkq96cNFCpixVvFzM5Jua/KvNdMJhjmEaIroAQBH\nDHEt4KFwB4/Gobs+NGGokTrSzvTHiFx3jNbyZVPkIgGawOwoAQ02d5ARpvhe\nMWzaeWQ4Xfn2FdaVH2b3AFw7aQA3u2bIYzw91oqzlLb8bBUuOhP2ONrZtE1p\nbhF8e96G49j52dNIEXeRvO1yvGKGTAJaICZTB5Ivo6aHkhmJVuHNtIJbaTTM\nUepg/+SkWoHbKJfYXHE6TSKt1HenE8nrNKz7QcxQ/KGu/t8t+fSXwTbK5zfd\nn0TsqaXJDsOQ2786jEDXI0eI8NVT/7XQ2b/6++/8YoqArvL2vvqLJbctUFgC\naRtkfTbJcLL0kVcolD2p8fcUcjnObZWiR5B4N5se4X4aEpD2X5bi+MBY+4n7\nzFVDLoelrmilfQ5+C2Ndqhx48CqxTPwrb8/whQ1KJYBYgbaaZMlMige2J4wL\nsK2KLhmIK4xHvRE2vN6+2ylMbvHJbN5nDjHAws4tKNI4rcAnIEs+vtVDULyz\nMuZPogNkRIJzMkeXj64YMHKrm7uqDdwfwWhPu6ZTcdvgTyUsW8z0EglMA0vz\nfE6m\r\n=Qkaf\r\n-----END PGP SIGNATURE-----\r\n",
"signatures": [
{
"keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA",
"sig": "MEUCIQCmwGFg6ceHdGuDq8pfV4zvNV5Fn1SPT4Rchhztjwo2iAIgbQVwiL4n+8HYrgpksW+tlLpCCLAPBYXWFsjpEGT38go="
}
]
}Observed since 20 Oct, 20:37 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:157efebe0efeb9b4d48c8fb420618f3314eead47cb08ce40dee672ecb22bb5ef