ORM
  • Introduction
  • Basics of Usage
    • Connecting to the Database
    • Creating a Model
    • Simple Queries
  • Configuration
  • Core Features
    • Models
    • CRUD Operations (Create, Read, Update, Delete): examples
    • Relationships
    • Transactions
  • Advanced Usage
    • Data Definition Language
    • Indexes
    • Triggers
    • Caching
  • Examples and templates
  • Security
    • Query parameterization and protection against SQL injections
    • Logging
    • Monitoring
    • Sanitization
  • ORM-CLI
    • Installing
    • Commands and usage
  • System architecture and implementation
    • Support of various databases
      • Implementation using a pattern strategy
      • Implementation using generics
      • Implementation using metaprogramming
    • Decorators
    • Migrations
      • Assignment of id in Tables and Columns
      • Assigning IDs to indexes and triggers
      • Working with migrations in ORM-CLI
        • Implementation of a pattern command for migration
    • QueryBuilder
    • Caching
    • File structure
  • API
    • Decorators
      • Column
      • ComputedColumn
      • Index
      • ForeignKey
      • PrimaryGeneratedColumn
      • Relations
      • Table
      • Trigger
      • Types decorators
        • Integer
        • Numeric
        • Float
        • Boolean
        • String
    • DDL
    • QueryBuilder
    • Additional API
Powered by GitBook
On this page

Examples and templates

In this section, we will look at some examples of simple queries to the users table in our ORM system.

  1. Create a view that displays all directory items in code order.

const selectAllUsers = await databaseManager.queryBuilder<Users[]>()
    .createView('allUsersView')
    .select()
    .from('users')
    .execute();
  1. Create a selection query with logical operations under record selection conditions.

const selectQueryExample = await databaseManager.queryBuilder<Tasks[]>()
    .select(['task_id', 'title', 'status'])
    .from('tasks')
    .where({
        conditions: {
            is_completed: { eq: false },
            price: { gt: 50 }
        },
        logicalOperator: 'and'
    })
    .orderBy('due_date', 'ASC')
    .execute();
  1. Subqueries.

const subquery = databaseManager.queryBuilder()
    .select(['username'])
    .from('users')
    .where({ conditions: { is_active: { eq: true } } })
    .build(true, false, false);

const mainQuery = await databaseManager.queryBuilder()
    .select(['user_id', 'username'])
    .from('users')
    .where({ conditions: { username: { in: subquery } } })
    .parametrize([subquery])
    .execute()
  1. Joining tables.

const queryWithLeftJoin = await databaseManager.queryBuilder()
    .select(['users.username', 'sections.name'])
    .from('users')
    .leftJoin('sections', {
        column: 'users.user_id', // основна колонка в таблиці Users
        operator: '=',
        value: 'sections.user_id' // колонка в таблиці Sections
    })
    .orderBy('users.username', 'ASC')
    .execute()
  1. Connection.

const query1 = databaseManager.queryBuilder()
    .select(['user_id', 'username'])
    .from('users')
    .where({ conditions: { is_active: { eq: true } } });

const query2 = databaseManager.queryBuilder()
    .select(['user_id', 'username'])
    .from('users')
    .where({ conditions: { is_active: { eq: false } } });

const exampleOfUnionQuery = await query1.union(query2).parametrize([true, false]).execute();
const exampleOfUnionAllQuery = await query1.unionAll(query2).parametrize([true, false]).execute();
  1. Create a simple grouping query using the Sum statistical function.

const sumQuery = await databaseManager.queryBuilder()
    .select(['SUM(price) AS total_price'])
    .from('tasks')
    .execute();
  1. Creating a grouping query using the HAVING clause.

const havingQuery = await databaseManager.queryBuilder()
    .select(['user_id', 'COUNT(*) AS task_count'])
    .from('tasks')
    .groupBy(['user_id'])
    .having({ conditions: { 'COUNT(*)': { gt: 5 } } })
    .execute();
  1. Create a group request.

const groupByQuery = await databaseManager.queryBuilder()
    .select(['user_id', 'COUNT(*) AS task_count'])
    .from('tasks')
    .groupBy(['user_id'])
    .execute();
  1. Create an update request.

const updateQueryExample = await databaseManager.queryBuilder()
    .update({ is_completed: true }, 'tasks')
    .where({ conditions: { task_id: { eq: 1 } }, logicalOperator: 'and' })
    .execute();
  1. Create a removal request.

const deleteQueryExample = await databaseManager.queryBuilder()
    .delete('tasks')
    .where({ conditions: { title: { eq: 'Завдання 2' } }})
    .execute();
  1. Create an add request.

const insertQueryExample = await databaseManager.queryBuilder()
    .insert({
        task_id: 1,
        title: 'Новий таск',
        description: 'Опис нового таску',
        is_completed: false,
        due_date: '2024-12-31',
        price: 100.50
    }, 'tasks')
    .execute();
  1. Creating triggers.

import {Trigger, TriggerEventsTypes, TriggerTimingsTypes, Table} from "@myroslavshymon/orm";

@Trigger({
    name: 'before_update_task',
    event: TriggerEventsTypes.UPDATE,
    timing: TriggerTimingsTypes.BEFORE,
    triggerFunction: `
        BEGIN
            IF NEW.is_completed THEN
                NEW.completed_at = CURRENT_TIMESTAMP;
            END IF;
            RETURN NEW;
        END;
    `,
    triggerFunctionName: 'set_completion_time'
})
@Table({name: 'tasks'})
export class Tasks {
    // поля таблиці tasks
}
  1. Creation of indexes.

import {Index, Column, PrimaryGeneratedColumn, Table} from "@myroslavshymon/orm";

@Index({indexName: 'user_index', columns: ['username', 'email'], options: {isUnique: true}})
@Table({name: 'users'})
export class Users {
    @PrimaryGeneratedColumn({type: 'BIGINT'})
    user_id: number;

    @Column({options: {dataType: "VARCHAR", length: 255}})
    username: string;

    @Column({options: {dataType: "VARCHAR", length: 255}})
    email: string;

    @Column({options: {dataType: "VARCHAR", length: 255}})
    password: string;

    @Column({options: {dataType: 'BOOLEAN', defaultValue: false}})
    is_active: boolean;
}
  1. Caching.

const selectUsersQueryCached = await databaseManager.queryBuilder<Users[]>()
    .select(['user_id', 'username', 'email'])
    .from('users')
    .orderBy('username', 'ASC')
    .cache({ ttl: 60000, key: 'users_list' });
PreviousCachingNextQuery parameterization and protection against SQL injections

Last updated 9 months ago