knex postgres returns 字符串 numeric/decimal 值
knex postgres returns strings for numeric/decimal values
我有一个 table 列
table.decimal('some_column', 30,15)
在 postgres 上是 numeric(30,15)
当我 运行 来自节点的 knex.raw('select some_column from some_table')
时,我在行中得到的响应如下:
some_column: "5.000000000000000"
some_column: "10.000000000000000"
真正让我明白这一点的是,我做了类似 firstValue>lastValue 这样的事情,我最终得到了一个真实的响应,这让我认为这些是作为字符串而不是数字返回的。
有什么方法可以覆盖此行为?
你可以看看 pg-types module, which is used by pg 模块,它被 knex
使用,并配置你的变量解析
var types = require('pg').types
types.setTypeParser(<I DONT REMEMBER VAR NAME, NEED TO CHECK>, value => value === null ? null : +value)
有关原因和可能解决方案的解释
检查这个很棒的答案
您了解了问题和可能的解决方案。
pg 类型的使用
在这里查看我的回答:
简历:
所有内置类型:
const typesBuiltins = {
BOOL: 16,
BYTEA: 17,
CHAR: 18,
INT8: 20,
INT2: 21,
INT4: 23,
REGPROC: 24,
TEXT: 25,
OID: 26,
TID: 27,
XID: 28,
CID: 29,
JSON: 114,
XML: 142,
PG_NODE_TREE: 194,
SMGR: 210,
PATH: 602,
POLYGON: 604,
CIDR: 650,
FLOAT4: 700,
FLOAT8: 701,
ABSTIME: 702,
RELTIME: 703,
TINTERVAL: 704,
CIRCLE: 718,
MACADDR8: 774,
MONEY: 790,
MACADDR: 829,
INET: 869,
ACLITEM: 1033,
BPCHAR: 1042,
VARCHAR: 1043,
DATE: 1082,
TIME: 1083,
TIMESTAMP: 1114,
TIMESTAMPTZ: 1184,
INTERVAL: 1186,
TIMETZ: 1266,
BIT: 1560,
VARBIT: 1562,
NUMERIC: 1700,
REFCURSOR: 1790,
REGPROCEDURE: 2202,
REGOPER: 2203,
REGOPERATOR: 2204,
REGCLASS: 2205,
REGTYPE: 2206,
UUID: 2950,
TXID_SNAPSHOT: 2970,
PG_LSN: 3220,
PG_NDISTINCT: 3361,
PG_DEPENDENCIES: 3402,
TSVECTOR: 3614,
TSQUERY: 3615,
GTSVECTOR: 3642,
REGCONFIG: 3734,
REGDICTIONARY: 3769,
JSONB: 3802,
REGNAMESPACE: 4089,
REGROLE: 4096
};
你可以在这里找到
https://github.com/brianc/node-pg-types/blob/master/lib/builtins.js
使用示例:
const pg = require('pg');
pg.types.setTypeParser(pg.types.builtins.INT8, (value: string) => {
return parseInt(value);
});
pg.types.setTypeParser(pg.types.builtins.FLOAT8, (value: string) => {
return parseFloat(value);
});
pg.types.setTypeParser(pg.types.builtins.NUMERIC, (value: string) => {
return parseFloat(value);
});
我有一个 table 列
table.decimal('some_column', 30,15)
在 postgres 上是 numeric(30,15)
当我 运行 来自节点的 knex.raw('select some_column from some_table')
时,我在行中得到的响应如下:
some_column: "5.000000000000000"
some_column: "10.000000000000000"
真正让我明白这一点的是,我做了类似 firstValue>lastValue 这样的事情,我最终得到了一个真实的响应,这让我认为这些是作为字符串而不是数字返回的。
有什么方法可以覆盖此行为?
你可以看看 pg-types module, which is used by pg 模块,它被 knex
使用,并配置你的变量解析
var types = require('pg').types
types.setTypeParser(<I DONT REMEMBER VAR NAME, NEED TO CHECK>, value => value === null ? null : +value)
有关原因和可能解决方案的解释
检查这个很棒的答案
您了解了问题和可能的解决方案。
pg 类型的使用
在这里查看我的回答:
简历:
所有内置类型:
const typesBuiltins = {
BOOL: 16,
BYTEA: 17,
CHAR: 18,
INT8: 20,
INT2: 21,
INT4: 23,
REGPROC: 24,
TEXT: 25,
OID: 26,
TID: 27,
XID: 28,
CID: 29,
JSON: 114,
XML: 142,
PG_NODE_TREE: 194,
SMGR: 210,
PATH: 602,
POLYGON: 604,
CIDR: 650,
FLOAT4: 700,
FLOAT8: 701,
ABSTIME: 702,
RELTIME: 703,
TINTERVAL: 704,
CIRCLE: 718,
MACADDR8: 774,
MONEY: 790,
MACADDR: 829,
INET: 869,
ACLITEM: 1033,
BPCHAR: 1042,
VARCHAR: 1043,
DATE: 1082,
TIME: 1083,
TIMESTAMP: 1114,
TIMESTAMPTZ: 1184,
INTERVAL: 1186,
TIMETZ: 1266,
BIT: 1560,
VARBIT: 1562,
NUMERIC: 1700,
REFCURSOR: 1790,
REGPROCEDURE: 2202,
REGOPER: 2203,
REGOPERATOR: 2204,
REGCLASS: 2205,
REGTYPE: 2206,
UUID: 2950,
TXID_SNAPSHOT: 2970,
PG_LSN: 3220,
PG_NDISTINCT: 3361,
PG_DEPENDENCIES: 3402,
TSVECTOR: 3614,
TSQUERY: 3615,
GTSVECTOR: 3642,
REGCONFIG: 3734,
REGDICTIONARY: 3769,
JSONB: 3802,
REGNAMESPACE: 4089,
REGROLE: 4096
};
你可以在这里找到 https://github.com/brianc/node-pg-types/blob/master/lib/builtins.js
使用示例:
const pg = require('pg');
pg.types.setTypeParser(pg.types.builtins.INT8, (value: string) => {
return parseInt(value);
});
pg.types.setTypeParser(pg.types.builtins.FLOAT8, (value: string) => {
return parseFloat(value);
});
pg.types.setTypeParser(pg.types.builtins.NUMERIC, (value: string) => {
return parseFloat(value);
});