# DynamicView() function · @imqueue/pg-sequelize

Source: https://imqueue.org/api/pg-sequelize/latest/pg-sequelize.dynamicview/
Published: 2026-08-01
Author: @imqueue maintainers (https://github.com/imqueue)
Package: @imqueue/pg-sequelize 4.2.0 — generated reference, not hand-written

Declares a model to be a view whose definition is parameterised per query.

**Signature:**

```typescript
export declare function DynamicView(options: IDynamicViewDefineOptions): (target: any) => void;
```

## Parameters


| Parameter | Type | Description |
| --- | --- | --- |
| options | [IDynamicViewDefineOptions](https://imqueue.org/api/pg-sequelize/latest/pg-sequelize.idynamicviewdefineoptions/) | Model options carrying the definition and the parameter defaults. |


**Returns:**

(target: any) => void

A class decorator.

## Exceptions

TypeError when the definition is missing or blank, or when it names a placeholder that `viewParams` does not.

## Remarks

Everything `View` does, plus placeholders. The definition may carry `@{name}` markers, every finder accepts `viewParams` to fill them, and the select-query generator substitutes them and splices the resulting statement into the query — as the `FROM` target, or as a joined subquery when the view is reached through an `include`. One model then serves a family of views that differ only by a constant, which is the alternative to defining one view per variant in a migration.

Every placeholder must have a default in `viewParams`. That is checked while the class is being defined, so a missing one is an error at import rather than a malformed statement at query time.

Values are escaped, so a parameter can carry a caller's input. Anything that is not a number or a string becomes `NULL`.

## Example


```typescript
@DynamicView({
    viewDefinition: `
        CREATE OR REPLACE VIEW "ProductRevenue" AS
        SELECT "productId" AS "id", SUM("payment") AS "revenue"
          FROM "Order"
         WHERE "currency" = @{currency}
         GROUP BY "productId"
    `,
    viewParams: { currency: 'USD' },
    freezeTableName: true,
    timestamps: false,
})
export class ProductRevenue extends BaseModel<ProductRevenue> {
    @PrimaryKey
    @Column(DataType.BIGINT)
    declare public id: number;
}

// the same model, read in another currency
const rows = await ProductRevenue.findAll({
    viewParams: { currency: 'EUR' },
});
```

