Hi all,
I have manually created three new entities in my models as described in the documentation.
Here is for example one of them:
// This model was generated by Lumber. However, you remain in control of your models.
// Learn how here: https://docs.forestadmin.com/documentation/v/v6/reference-guide/models/enrich-your-models
module.exports = (sequelize, DataTypes) => {
const { Sequelize } = sequelize;
// This section contains the fields of your model, mapped to your table's columns.
// Learn more here: https://docs.forestadmin.com/documentation/v/v6/reference-guide/models/enrich-your-models#declaring-a-new-field-in-a-model
const CatalogService = sequelize.define('catalogService', {
id: {
type: DataTypes.UUID,
allowNull: false,
primaryKey: true,
defaultValue: Sequelize.literal('gen_random_uuid()')
},
sortingValue: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0
},
published: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
},
}, {
tableName: 'catalog_service',
underscored: true,
schema: process.env.DATABASE_SCHEMA,
});
// This section contains the relationships for this model. See: https://docs.forestadmin.com/documentation/v/v6/reference-guide/relationships#adding-relationships.
CatalogService.associate = (models) => {
CatalogService.belongsTo(models.catalogDomain, {
foreignKey: {
name: 'catalogDomainIdKey',
field: 'catalog_domain_id',
},
as: 'catalogDomain',
});
};
return CatalogService;
};
The matching Table for it is:
CREATE TABLE "catalog_service" (
"id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
"catalog_domain_id" UUID REFERENCES "catalog_domain",
"sorting_value" INT NOT NULL DEFAULT 0,
"published" BOOLEAN NOT NULL DEFAULT false
);
Expected behavior
I expect the table to be available with the structure define on the model.
Actual behavior
The Entities are available on the UI after restarting but I’m getting an error message:
hop_hop_admin | [forest] 🌳🌳🌳 Unexpected error: column catalogService.created_at does not exist
hop_hop_admin | SequelizeDatabaseError: column catalogService.created_at does not exist
hop_hop_admin | at Query.formatError (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:354:16)
hop_hop_admin | at query.catch.err (/usr/src/app/node_modules/sequelize/lib/dialects/postgres/query.js:71:18)
hop_hop_admin | at tryCatcher (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/util.js:16:23)
hop_hop_admin | at Promise._settlePromiseFromHandler (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:547:31)
hop_hop_admin | at Promise._settlePromise (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:604:18)
hop_hop_admin | at Promise._settlePromise0 (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:649:10)
hop_hop_admin | at Promise._settlePromises (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:725:18)
hop_hop_admin | at _drainQueueStep (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/async.js:93:12)
hop_hop_admin | at _drainQueue (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/async.js:86:9)
hop_hop_admin | at Async._drainQueues (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/async.js:102:5)
hop_hop_admin | at Immediate.Async.drainQueues [as _onImmediate] (/usr/src/app/node_modules/sequelize/node_modules/bluebird/js/release/async.js:15:14)
hop_hop_admin | at runCallback (timers.js:705:18)
hop_hop_admin | at tryOnImmediate (timers.js:676:5)
hop_hop_admin | at processImmediate (timers.js:658:5)
There is no created_at nor updated_at fields define on this model.
Those fields show up also on the UI?
I looked at the .forestadmin-schema.json file and indeed I can find those fields there for those entities. Where is this coming from? I have deleted the file as I’m working in development mode and it is then recreated but those fields show up there again… Any idea where the confusion is coming from? Is there any cache that I need to delete?
Failure Logs
The .forestadmin-schema.json for info
{
"collections": [{
"name": "catalogDomain",
"nameOld": "catalogDomain",
"icon": null,
"integration": null,
"isReadOnly": false,
"isSearchable": true,
"isVirtual": false,
"onlyForRelationships": false,
"paginationType": "page",
"fields": [{
"field": "catalogDomainServices",
"type": ["Number"],
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "catalogService.catalogDomainIdKey",
"inverseOf": null,
"relationship": "HasMany",
"validations": []
}, {
"field": "catalogDomainTranslations",
"type": ["Number"],
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "catalogDomainTranslation.catalogDomainIdKey",
"inverseOf": null,
"relationship": "HasMany",
"validations": []
}, {
"field": "createdAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "id",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "published",
"type": "Boolean",
"defaultValue": false,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": true,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": [{
"message": null,
"type": "is present",
"value": null
}]
}, {
"field": "sortingValue",
"type": "Number",
"defaultValue": 0,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": true,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": [{
"message": null,
"type": "is present",
"value": null
}]
}, {
"field": "updatedAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}],
"segments": [],
"actions": []
}, {
"name": "catalogDomainTranslation",
"nameOld": "catalogDomainTranslation",
"icon": null,
"integration": null,
"isReadOnly": false,
"isSearchable": true,
"isVirtual": false,
"onlyForRelationships": false,
"paginationType": "page",
"fields": [{
"field": "catalogDomain",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "catalogDomain.catalogDomainIdKey",
"inverseOf": null,
"relationship": "BelongsTo",
"validations": []
}, {
"field": "createdAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "id",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "name",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": true,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": [{
"message": null,
"type": "is present",
"value": null
}]
}, {
"field": "updatedAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}],
"segments": [],
"actions": []
}, {
"name": "catalogService",
"nameOld": "catalogService",
"icon": null,
"integration": null,
"isReadOnly": false,
"isSearchable": true,
"isVirtual": false,
"onlyForRelationships": false,
"paginationType": "page",
"fields": [{
"field": "catalogDomain",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "catalogDomain.catalogDomainIdKey",
"inverseOf": null,
"relationship": "BelongsTo",
"validations": []
}, {
"field": "createdAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "id",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "published",
"type": "Boolean",
"defaultValue": false,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": true,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": [{
"message": null,
"type": "is present",
"value": null
}]
}, {
"field": "sortingValue",
"type": "Number",
"defaultValue": 0,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": true,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": [{
"message": null,
"type": "is present",
"value": null
}]
}, {
"field": "updatedAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}],
"segments": [],
"actions": []
}, {
"name": "professional",
"nameOld": "professional",
"icon": null,
"integration": null,
"isReadOnly": false,
"isSearchable": true,
"isVirtual": false,
"onlyForRelationships": false,
"paginationType": "page",
"fields": [{
"field": "avatarUrl",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "companyName",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "createdAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "displayName",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "email",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": [{
"message": null,
"type": "is longer than",
"value": 10
}, {
"message": null,
"type": "is shorter than",
"value": 35
}]
}, {
"field": "firstName",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "id",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "lastName",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "phoneNumber",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "professionalActiveRegions",
"type": ["Number"],
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "professionalActiveRegion.professionalIdKey",
"inverseOf": null,
"relationship": "HasMany",
"validations": []
}, {
"field": "professionalAddresses",
"type": ["Number"],
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "professionalAddress.professionalIdKey",
"inverseOf": null,
"relationship": "HasMany",
"validations": []
}, {
"field": "status",
"type": "String",
"defaultValue": "NEW",
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": true,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": [{
"message": null,
"type": "is present",
"value": null
}]
}, {
"field": "stripeId",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "updatedAt",
"type": "Date",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "userId",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "vatNumber",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}],
"segments": [],
"actions": []
}, {
"name": "professionalActiveRegion",
"nameOld": "professionalActiveRegion",
"icon": null,
"integration": null,
"isReadOnly": false,
"isSearchable": true,
"isVirtual": false,
"onlyForRelationships": false,
"paginationType": "page",
"fields": [{
"field": "city",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "country",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "id",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "professional",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "professional.professionalIdKey",
"inverseOf": null,
"relationship": "BelongsTo",
"validations": []
}, {
"field": "zipCode",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}],
"segments": [],
"actions": []
}, {
"name": "professionalAddress",
"nameOld": "professionalAddress",
"icon": null,
"integration": null,
"isReadOnly": false,
"isSearchable": true,
"isVirtual": false,
"onlyForRelationships": false,
"paginationType": "page",
"fields": [{
"field": "city",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "country",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "id",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "professional",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": "professional.professionalIdKey",
"inverseOf": null,
"relationship": "BelongsTo",
"validations": []
}, {
"field": "street1",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "street2",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}, {
"field": "zipCode",
"type": "String",
"defaultValue": null,
"enums": null,
"integration": null,
"isFilterable": true,
"isReadOnly": false,
"isRequired": false,
"isSortable": true,
"isVirtual": false,
"reference": null,
"inverseOf": null,
"validations": []
}],
"segments": [],
"actions": []
}],
"meta": {
"database_type": "postgres",
"liana": "forest-express-sequelize",
"liana_version": "6.2.0",
"engine": "nodejs",
"engine_version": "10.20.1",
"framework": "express",
"framework_version": "~4.16.3",
"orm_version": "5.15.2"
}
}
Context
Please provide any relevant information about your setup.
- Package Version:
- Express Version:
- Sequelize Version:
- Database Dialect:
- Database Version:
- Project Name: