immudb-node icon indicating copy to clipboard operation
immudb-node copied to clipboard

What is the current proper way to set up parameters for a query ?

Open efsant0s opened this issue 7 months ago • 0 comments

Hello, I'm trying to utilize the latest version, but I'm currently struggling to pass parameters to my query. Doesn't matter what I do, I receive an stop application exception without stack.

My existing database script:

CREATE TABLE IF NOT EXISTS unit_area (
    serial_area VARCHAR(50),
    created VARCHAR(50),
    updated VARCHAR(50),
    label VARCHAR(50),
    format VARCHAR(50),
    decimal VARCHAR(50),
    PRIMARY KEY (serial_area)
);

My main class:

const dynamicImport = async (packageName: string) => new Function(`return import('${packageName}')`)(); 
import { QueryImmudb } from './database.dto';
import { SqlExecProps } from '@codenotary/immudb-node/dist/immu-api/sql-exec';
import { HttpStatus, Injectable } from '@nestjs/common'; 
@Injectable()
export class ImmudbService extends MainService {

    public async insertData(queryBuilder: QueryImmudb): Promise<boolean> {
        const con = await this.getConnection();
        try {
            this.logDebug("[ImmudbService] [insertData] INIT-->", { sql: queryBuilder.sql, params: queryBuilder.params });
            const tst = queryBuilder.getParams();
            console.log(tst)
            console.log(queryBuilder.sql)
            const sqlExecReq: SqlExecProps = {
                sql: queryBuilder.sql,
                params: [
                    {name: ':label', type: 'VARCHAR', value: 'TESTE'},
                    {name: ':format', type: 'VARCHAR', value: 'TESTE'},
                    {name: ':decimal', type: 'VARCHAR', value: 'TESTE'},
                       ]
            }; 
            const sqlExecRes = await con.sqlExec(sqlExecReq);

            this.logInfo("[ImmudbService] [insertData] SUCCESS:", sqlExecRes);
            return true;

        } catch (ex: any) {
            console.error(ex.message)
            throw new ErrorManager("ImmudbService-->insertData", ex.message,
                null, null, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}

My QueryImmudb parameters:{

    const insertQuery = new QueryImmudb();
    insertQuery.sql = `
    INSERT INTO unit_date (
       serial_date,
       created ,
       updated,
       label,
       format,
       decimal
    )
    VALUES (
       ${'cast(random_uuid() as VARCHAR)'},
       cast( NOW() as VARCHAR) ,
       cast( NOW() as VARCHAR) ,
       :label,
       :format,
       :decimal
    )
 `;
 
 // Add the remaining parameters using addParams
 insertQuery.addParams('label', 'Date Label 1');
 insertQuery.addParams('format', 'YYYY-MM-DD');
 insertQuery.addParams('decimal', '2'); 
}

My QueryImmudb class:

export class QueryImmudb {

    sql: string;
    params: { name: string; type: string; value: any }[];

    constructor() {
        this.sql = '';
        this.params = [];
    }

    addParams(column: string, value: any, type: string = 'VARCHAR'): void {
        const param: { name: string; type: string; value: any } = {
            name: `:${column}`,
            type: type,
            value: value,   
        };
        this.params.push(param);
    }

    getParams(): any[] {
        return this.params.map(param => ({
            name: param.name,
            type: param.type, // Convert type to SqlType
            value: param.value,
        }));
    }
}

efsant0s avatar Nov 14 '23 20:11 efsant0s