loopbackio / loopback-next

LoopBack makes it easy to build modern API applications that require complex integrations.
https://loopback.io
Other
4.95k stars 1.07k forks source link

Allow Class/Model Name to Have A Different Name From the Database Table #2134

Open shadyanwar opened 5 years ago

shadyanwar commented 5 years ago

Description / Steps to reproduce / Feature proposal

Create/map a class/model with a name different from the name in its MySQL table

Current Behavior

If the class name is different, there is no way to map it to the correct table having a different name.

Expected Behavior

Just like individual properties inside the class, a class/model should be allowed to be exposed with a custom name different from that in the database table.

dhmlau commented 5 years ago

@shadyanwar , you can specify the model name that is different from the table name. Cross posting my comment in https://github.com/strongloop/loopback/issues/4086#issuecomment-445015678:

@model({
  settings: {
    postgresql: {
      table: 'customer',
    },
  },
})
export class Customer2 extends Entity {
shadyanwar commented 5 years ago

Worked like a charm! Thank you! It would seriously help if the "lb4 model" command added this automatically as a start. The developer can then manually modify it if desired.

bajtos commented 5 years ago

It would seriously help if the "lb4 model" command added this automatically as a start. The developer can then manually modify it if desired.

This is a great suggestion. Would you @shadyanwar like to contribute this improvement yourself?

Let's reopen this issue to keep track of this enhancement.

shadyanwar commented 5 years ago

@bajtos Sure. Could you please point to me where to look? I thought it would be https://github.com/strongloop/loopback-cli/blob/master/bin/loopback-cli.js

dhmlau commented 5 years ago

@shadyanwar, the CLI code for LB4 can be found in the cli package: https://github.com/strongloop/loopback-next/tree/master/packages/cli.

@bajtos @shadyanwar, I'm not sure if adding the database/table information as part of the lb4 model would be a good idea. Supposedly, at the point of creating a model, someone may not know or care about how it connects to a database?

bajtos commented 5 years ago

I'm not sure if adding the database/table information as part of the lb4 model would be a good idea. Supposedly, at the point of creating a model, someone may not know or care about how it connects to a database?

Fair point.

In LB4, it's possible to attach a single model to multiple datasources (databases). For long term, we may want to find a way how to specify the table name at repository level.

At the moment, the only solution for customizing table name is to use database-specific model configuration as shown in https://github.com/strongloop/loopback-next/issues/2134#issuecomment-445494970.

As I am thinking about this more, I see a different problem: the table name is specific to a connector (e.g. postgresql: {table: 'Customer'}}). When creating a new model via lb4 model, we don't know what connector will be backing the new model, that decision is made later when creating a repository for the new model and choosing which datasource to use.

So at the end, I am not sure what to change. I guess the best option is to enhance our model template with a comment showing users how to add custom configuration?

The template in loopback-next/packages/cli/generators/model/templates/model.ts.ejs generates the following TypeScript code now:

@model()
export class Customer extends Entity {

Proposed new version:

@model({
  settings: {
    // Configure model settings here, e.g. set a custom table name
    // https://loopback.io/doc/en/lb3/Model-definition-JSON-file.html#data-source-specific-options
  }
})
export class Customer extends Entity {

@strongloop/loopback-maintainers thoughts?

yueshaohui commented 4 years ago

@shadyanwar , you can specify the model name that is different from the table name. Cross posting my comment in https://github.com/strongloop/loopback/issues/4086#issuecomment-445015678:

@model({
  settings: {
    postgresql: {
      table: 'customer',
    },
  },
})
export class Customer2 extends Entity {

It seems like DB2 doesn't work in this way

yueshaohui commented 4 years ago
@model({
  settings: {
    db2: {
      table: 'usage',
      schema: 'att'
    },
  },
})

even I add code above I still get the same issue

[CLI Driver][DB2/LINUXX8664] SQL0204N  "SHAO.usage" is an undefined name.  SQLSTATE=42704

I don't know why it always uses my user name SHAO as to be the schema but not att.

dhmlau commented 4 years ago

@yueshaohui, I think you need to specify the schema in the DataSource.

yueshaohui commented 4 years ago

@yueshaohui, I think you need to specify the schema in the DataSource.

Yes, Actually I have a schema configured in my DataSource, and everything running well as connecting DB2 in a general way. But I'm trying to access to DB2 in DSN way, it can't be able to map schema correctly.

Thanks for your help

following is the configuration in my DataSource

config: {
    "dsn": DATABASE=${DATABASE};HOSTNAME=${HOST};PORT=${PORT};PROTOCOL=TCPIP;UID=${USERID};PWD=${PASSWORD};Security=SSL;
    "name": "test",
    "connector": CONNECTOR,
    "host": HOST,
    "port": PORT,
    "user": USERID,
    "password": PASSWORD,
    "database": DATABASE,
    "schema": "ATT"
  }