-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
A situation similar to #3749
Steps to reproduce
lb4 datasourcelb4 discoverlb4 repository
? Please select the datasource TestDbDatasource
? Select the model(s) you want to generate a repository TestTable
? Please select the repository base class DefaultCrudRepository (Legacy juggler bridge)
lb4 controller
? Controller class name: Test
Controller Test will be created in src/controllers/test.controller.ts
? What kind of controller would you like to generate? REST Controller with CRUD functions
? What is the name of the model to use with this CRUD repository? TestTable
? What is the name of your CRUD repository? TestTableRepository
? What is the name of ID property? testId
? What is the type of your ID? number
? Is the id omitted when creating a new instance? Yes
? What is the base HTTP path name of the CRUD operations? /test-tables
- Modify model
@model({
settings: {
idInjection: false,
postgresql: {schema: 'public', table: 'testTable'},
},
})
export class TestTable extends Entity {
@property({
type: 'number',
required: false, // true -> false
scale: 0,
id: 1,
postgresql: {
columnName: 'testId',
dataType: 'bigint',
dataLength: null,
dataPrecision: null,
dataScale: 0,
nullable: 'NO',
},
})
testId: number;
@property({
type: 'string',
required: true,
length: 100,
postgresql: {
columnName: 'testContent',
dataType: 'character varying',
dataLength: 100,
dataPrecision: null,
dataScale: null,
nullable: 'NO',
},
})
testContent: string;
// Define well-known properties here
// Indexer property to allow additional data
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[prop: string]: any;
constructor(data?: Partial<TestTable>) {
super(data);
}
}Current Behavior
Do the following
const test = await this.testTableRepository.create({testContent: "test"});
console.log(test);Result
TestTable { testId: undefined, testContent: 'test' }
The instance is being created in the database, but it somehow failed to map to the property.
Expected Behavior
I want it to look like the following
TestTable { testId: 1, testContent: 'test' }
Additional information
The following is a guess
I think the problem is that it is toLowerCase() in the function here.
https://github.com/strongloop/loopback-connector-postgresql/blob/v3.9.0/lib/postgresql.js#L369
After rewriting as below, it worked.
PostgreSQL.prototype.dbName = function(name) {
if (!name) {
return name;
}
// PostgreSQL default to lowercase names
// return name.toLowerCase();
return name;
};
-
PostgreSQL.prototype.getInsertedId
https://github.com/strongloop/loopback-connector-postgresql/blob/v3.9.0/lib/postgresql.js#L553 -
SQLConnector.prototype.idColumn
https://github.com/strongloop/loopback-connector/blob/v4.4.0/lib/sql.js#L423 -
PostgreSQL.prototype.dbName
https://github.com/strongloop/loopback-connector-postgresql/blob/v3.9.0/lib/postgresql.js#L369
lb4 --version
lb4 --version
@loopback/cli version: 1.30.1
@loopback/* dependencies:
- @loopback/authentication: ^3.3.3
- @loopback/boot: ^1.7.4
- @loopback/build: ^3.1.1
- @loopback/context: ^2.1.1
- @loopback/core: ^1.12.4
- @loopback/metadata: ^1.4.1
- @loopback/openapi-spec-builder: ^1.3.1
- @loopback/openapi-v3: ^2.0.0
- @loopback/repository-json-schema: ^1.12.2
- @loopback/repository: ^1.19.1
- @loopback/rest: ^2.0.0
- @loopback/testlab: ^1.10.3
- @loopback/docs: ^2.11.0
- @loopback/example-hello-world: ^1.2.25
- @loopback/example-log-extension: ^1.2.25
- @loopback/example-rpc-server: ^1.2.25
- @loopback/example-todo: ^2.0.0
- @loopback/example-soap-calculator: ^1.7.7
- @loopback/service-proxy: ^1.3.17
- @loopback/http-caching-proxy: ^1.3.0
- @loopback/http-server: ^1.5.4
- @loopback/example-todo-list: ^2.0.0
- @loopback/dist-util: ^0.4.0
- @loopback/rest-explorer: ^1.4.10
- @loopback/eslint-config: ^5.0.3
- @loopback/example-express-composition: ^1.10.4
- @loopback/example-greeter-extension: ^1.3.25
- @loopback/booter-lb3app: ^1.3.12
- @loopback/example-lb3-application: ^1.1.26
- @loopback/example-greeting-app: ^1.2.12
- @loopback/example-context: ^1.3.2
- @loopback/repository-tests: ^0.10.1
- @loopback/extension-health: ^0.2.17
- @loopback/authorization: ^0.4.10
- @loopback/rest-crud: ^0.6.6
- @loopback/security: ^0.1.13
- @loopback/authentication-passport: ^1.1.3
- @loopback/example-metrics-prometheus: ^0.1.7
- @loopback/extension-metrics: ^0.1.6
- @loopback/model-api-builder: ^1.1.4
- @loopback/extension-logging: ^0.1.0
Related Issues
- postgres connector not returning generated identifier value on create of entity for camelCased identifiers in table #3749
- Column names in lowercase using lb4 discover method - SQL connector #3343
- Identifier gets discarded after running migration #4744
Acceptance Criteria
- if the property has defined its column name, Postgres shouldn't use the default naming convention (lowercase), should keep as it is
- besides Postgres, Oracle has the same issue ( uppercase as default case)
- add tests for discover