1.0.0-alpha.77 • Published 4 years ago

@dandi-contrib/data-pg v1.0.0-alpha.77

Weekly downloads
-
License
MIT
Repository
github
Last release
4 years ago

@dandi-contrib/data-pg

@dandi-contrib/data-pg wraps the node-postgres client in implementations of @dandi/data's interfaces.

See @dandi/data for basic usage and configuration.

Using @dandi-contrib/data-pg In Your App

In addition to setting up the connection and authentication data described in @dandi/data, include PgDbModule in your DandiApplication providers:

import { DandiApplication } from '@dandi/core'
import { PgDbModule } from '@dandi-contrib/data-pg'

const myApp = new DandiApplication({
  providers: [

    ...

    // database
    PgDbModule,

    ...

  ],
})

Configuring ModelBuilder

Include a Provider<ModelBuilderOptions> for PgDbModelBuilderOptions in your DandiApplication providers:

import { DandiApplication } from '@dandi/core'
import { PgDbModelBuilderOptions, PgDbModule } from '@dandi-contrib/data-pg'
import { ModelBuilderOptions } from '@dandi/model-builder'

import { camel } from 'change-case'

const myApp = new DandiApplication({
  providers: [

    ...

    ModelBuilderOptions.provider(PgDbModelBuilderOptions, {
      keyTransform: camel, // translates snake_case table column names to camelCase
    }),

    ...

  ],
})

SELECT Expansion for Nested Models

@dandi/data-pg's DbQueryable implementation allows you to map columns from SELECT statements for models that nest other models. To enable this feature, you must construct your query in a specific manner:

  • Add aliases to the table identifier that match the name of the property
  • Include only the aliases of the tables you wish to include in the SELECT statement.

For example, given a model structure like so:

class CarModel {
  @Property(Uuid)
  public carId: Uuid

  @Property(String)
  public name: string
}
class DriverModel {
  @Property(Uuid)
  public driverId: Uuid

  @Property(String)
  public name: string
}
class DriverAssignmentModel {
  @Property(DriverModel)
  public driver: DriverModel

  @Property(CarModel)
  public car: CarModel
}

The query might look like:

SELECT
  driver,
  car
FROM driver_assignments a
JOIN drivers driver ON a.driver_id = driver.driver_id
JOIN cars car ON a.car_id = car.car_id

Calling dbClient.queryModel(DriverAssignmentModel, query) with the above query would result in the following expansion:

SELECT
  driver.driver_id as "driver.driver_id",
  driver.name as "driver.name",
  car.car_id as "car.car_id",
  car.name as "car.name"
FROM driver_assignments a
JOIN drivers driver ON a.driver_id = driver.driver_id
JOIN cars car ON a.car_id = car.car_id

The dot notation in the above expanded query, combined with a camelCase key transform (as shown above) will allow the ModelBuilder instance to correctly map the properties into their respective models.

1.0.0-alpha.76

4 years ago

1.0.0-alpha.77

4 years ago

1.0.0-alpha.74

4 years ago

1.0.0-alpha.73

4 years ago

1.0.0-alpha.75

4 years ago

1.0.0-alpha.72

4 years ago

1.0.0-alpha.71

5 years ago

1.0.0-alpha.70

5 years ago

1.0.0-alpha.69

5 years ago

1.0.0-alpha.67

5 years ago

1.0.0-alpha.68

5 years ago

1.0.0-alpha.66

5 years ago

1.0.0-alpha.65

5 years ago

1.0.0-alpha.63

5 years ago

1.0.0-alpha.64

5 years ago

1.0.0-alpha.62

5 years ago

1.0.0-alpha.61

5 years ago

1.0.0-alpha.60

5 years ago

1.0.0-alpha.59

5 years ago

1.0.0-alpha.58

5 years ago

1.0.0-alpha.57

5 years ago

1.0.0-alpha.56

5 years ago

1.0.0-alpha.55

5 years ago

1.0.0-alpha.54

5 years ago

1.0.0-alpha.53

5 years ago

1.0.0-alpha.52

5 years ago

1.0.0-alpha.50

6 years ago

1.0.0-alpha.49

6 years ago

1.0.0-alpha.48

6 years ago

1.0.0-alpha.47

6 years ago

1.0.0-alpha.46

6 years ago

1.0.0-alpha.45

6 years ago

1.0.0-alpha.44

6 years ago

1.0.0-alpha.43

6 years ago

1.0.0-alpha.42

6 years ago

1.0.0-alpha.41

6 years ago

1.0.0-alpha.40

6 years ago

1.0.0-alpha.39

6 years ago

1.0.0-alpha.38

6 years ago

1.0.0-alpha.37

6 years ago

1.0.0-alpha.36

6 years ago

1.0.0-alpha.35

6 years ago

1.0.0-alpha.34

6 years ago

1.0.0-alpha.33

6 years ago

1.0.0-alpha.32

6 years ago

1.0.0-alpha.31

7 years ago

1.0.0-alpha.30

7 years ago