Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

207
Views
Slonik - Insert row return data with join

I have a method to create a row in a database its created successfuly but the problem in returning value I need to join another table in dynamic way using slonik

Notice: normal join cause some trouble as I have column in both table with the same name

here is a sample of my code

function createTicketAgent(connection: DatabaseTransactionConnectionType) {
  return async (options: CreateTicketAgentOptions) => {
    const id = (await connection.oneFirst(
      sql`SELECT nextval('ticket_agent_sequence')`
    )) as number;

    const converted = convertTicketAgentDataIn(
      { ...options.data, id },
      options.adminId
    );
    const data = dataToInsertSql(converted);
    const selection = ticketAgentSelectionSql(options.selection);

    const query = sql`
      INSERT INTO ticket_agent ${data}
      RETURNING ${selection}
    `;

    const result = await connection.maybeOne(query);
    return convertTicketAgentDataOut(result);
  };
}
export function dataToInsertSql<T extends object>(data: T): SqlSqlTokenType {
  var firstItem = Array.isArray(data) ? data[0] : data;
  const entries = Object.entries(firstItem).sort();
  const columns = entries.map(([key, value]) => key);
  const values = entries.map(([key, value]) => value);
  return sql`(${listToIdentifiersSql(columns)}) VALUES (${listToValuesSql(
    values
  )})`;
}
export function listToIdentifiersSql(values: string[]) {
  const columns = values.map((column) => sql.identifier(column.split(".")));
  return sql`${sql.join(columns, sql`, `)}`;
}
const ticketAgentSelectionSql = (selection: string[] | undefined) =>
  selectionToSql(mapSelection(reverseMapping(mapping), selection));

export function selectionToSql<S extends SelectionSet<any>>(selection?: S) {
  if (selection === undefined || selection.length === 0) {
    return sql`*`;
  }
  const identifiers = selection.map((column) =>
    sql.identifier(column.split("."))
  );
  const selectList = sql.join(identifiers, sql`, `);
  return sql`${selectList}`;
}
export function listToValuesSql(values: any[], unique: boolean = false) {
  let converted = values.map((value) =>
    Array.isArray(value)
      ? `{${value}}`
      : value instanceof DateTime
      ? value.toSQL()
      : value
  );

  if (unique) {
    const uniqueSet = new Set<any>();
    converted.forEach((value) => {
      uniqueSet.add(value);
    });
    return sql`${sql.join([...uniqueSet], sql`, `)}`;
  } else {
    return sql`${sql.join(converted, sql`, `)}`;
  }
}
about 4 years ago · Juan Pablo Isaza
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!