node.js - Bigint-ების შენახვა typeorm-ში SQL Server მონაცემთა ბაზაში - პარამეტრი '0' ვერ იქნა დამოწმებული. მნიშვნელობა უნდა იყოს -2147483648 და 2147483647 შორის, შედებული


გვანიშნება, რომ tedious (რომელსაც იყენებს node mssql ტრაივერი) არასწორად ავლენს რეგულარული ზომის int-ით გადამოწმებას იმ სვეტისათვის, რომელიც განსაზღვრულია როგორც bigint. მე დავრწმუნდი SQL Server მონაცემთა ბაზაში და ვნახე, რომ შექმნილი სვეტი არის bigint, და ყველა შეკითხვა, რომელსაც ვაკეთებ azure data studio-ში ამ მონაცემთა ბაზასთან დიდი ints-ის გამოყენებით (მაგალითად, მნიშვნელობები 4 მილიარდზე მეტია), წარმატებით სრულდება.

მე მაქვს ასეთი typeorm სუბიექტი განსაზღვრული:

export class Employee extends BaseEntity {
  @PrimaryColumn('bigint')
  id: number;
...

და როდესაც მე ვცდილობ ის თანამშრომელი შევქმნა, მე მივიღე ეს შეცდომის შეტყობინება:

SELECT "Employee"."id" AS "Employee_id", ... FROM "employee" "Employee" WHERE "Employee"."id" IN (@0) -- PARAMETERS: [4382863930]

შეცდომა: RequestError: ვერ მოხერხდა პარამეტრის '0' გადამოწმება. მნიშვნელობა უნდა იყოს -2147483648-სა და 2147483647-ს შორის, მოიცავს ორივეს

არ ვარ დარწმუნებული, ეს უბრალოდ რაიმეს გამოტოვებაა თუ უნდა დავანიშნო მეტი ინფორმაცია სვეტის შესახებ ან თუ ეს რეალური პრობლემა არის typeorm-თან

პასუხი #1

თქვენ შეგიძლიათ გამოიყენოთ transform ფუნქცია, რომელიც typeorm-ში არის მიწოდებული. ასე რომ, ამ კონკრეტულ შემთხვევაში, თქვენი კოდი შეიძლება იყოს ასეთი,

https://typeorm.io/#/decorator-reference/column

ტრანსფორმერი: ValueTransformer|ValueTransformer[] - განსაზღვრავს მნიშვნელობის ტრანსფორმერს (ან მნიშვნელობის ტრანსფორმერების მასივს), რომელიც გამოიყენება ამ სვეტის (ან)მარშალირებისთვის ან როცა ვკითხულობთ, ან ვწერთ მონაცემთა ბაზაში. თუ არის მასივი, მნიშვნელობის ტრანსფორმერები გამოიყენება ბუნებრივ თანმიმდევრობაში entityValue-დან databaseValue-მდე, და პირიქით, databaseValue-დან entityValue-მდე.

import { BaseEntity, PrimaryColumn, ValueTransformer } from "typeorm";
export const bigint: ValueTransformer = {
  to: (entityValue: number) => entityValue.toString(),
  from: (databaseValue: string): number => parseInt(databaseValue, 10)
};
export class Employee extends BaseEntity {
  @PrimaryColumn('bigint', { transformer: [bigint] })
  id: number;
}