gpt4 book ai didi

postgresql - 我如何将 Postgres DateRange 类型与 TypeOrm 一起使用

转载 作者:行者123 更新时间:2023-12-04 11:45:40 25 4
gpt4 key购买 nike

我尝试使用 Nest.js 框架实现基本的酒店预订系统。
我使用 TypeOrm 和 Postgres 数据库。
我有一个预订实体(酒店房间预订)
和 Booking 应该有一个 DateRange(从入住到退房日期)。
我找不到如何在 TypeOrm 中使用 DateRange 对象类型。

@Entity({ name: 'booking' })
export class Booking{
@PrimaryGeneratedColumn()
id: number;

@Column({
type: 'daterange', // I expect to find DateRange type here
})
date_range: any;
}
任何的想法?

最佳答案

日期范围类型作为字符串读取并作为字符串写入。您需要使用/解析 postgres range type 的正确字符串表示.
为了使解析更容易,您可以在表上添加约束以仅允许包含范围。将此装饰器添加到类中:

@Check('booking_range_valid', 'NOT isempty(range) AND lower_inc(range) AND NOT upper_inc(range)')
您需要编写自己的转换器,将 Postgres 日期范围值转换为间隔表示。如果您使用 Luxon 间隔,您可以使用:
// Just a small helper to make transformers work with find operators
export const fixTransformer = (transformer: ValueTransformer) => ({
to(value: unknown) {
if (value instanceof FindOperator) {
return new FindOperator(value.type , transformer.to(value.value),
value.useParameter, value.multipleParameters);
} else {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return transformer.to(value);
}
},
from(value: unknown) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return transformer.from(value);
}
})
import {DateTime, Interval} from 'luxon';

// Postgres daterange string representation. [ means that start day is included, ) that end day is not.
const pattern = /\[(\d{4}-\d{2}-\d{2}),\s*(\d{4}-\d{2}-\d{2})\)/;
export const dateRangeIntervalTransformer = fixTransformer({
to(value: Interval | undefined): string | undefined {
if (value !== undefined && !value.isValid) {
throw new Error(`Got an invalid daterange, reason was ${value.invalidReason || '?'}`);
}
if (value) {
if (!value.start.startOf('day').equals(value.start)) {
throw new Error('Start of daterange needs to be the start of the day.');
}
if (!value.end.startOf('day').equals(value.end)) {
throw new Error('End of daterange needs to be the start of the day.');
}
return '[' + value.start.toISODate() + ',' + value.end.toISODate() + ')';
} else {
return undefined;
}
},
from(value: string | undefined): Interval | undefined {
if (value) {
const match = pattern.exec(value);
if (!match) {
throw new Error(`Date range does not match pattern ${pattern.source}: ${value}`);
}
return Interval.fromDateTimes(
DateTime.fromISO(match[1]).startOf('day'),
DateTime.fromISO(match[2]).startOf('day'));
} else {
return undefined;
}
}
});
然后在您的实体中使用它:
@Entity({ name: 'booking' })
@Check('booking_range_valid', 'NOT isempty(range) AND lower_inc(range) AND NOT upper_inc(range)')
export class Booking{
@PrimaryGeneratedColumn()
id: number;

@Column({
type: 'daterange',
nullable: false, // < If you allow null, change the converter to handle null values
transformer: dateRangeIntervalTransformer
})
date_range = Interval.after(DateTime.local().startOf('day'), {days: 1}); // < default value
}

关于postgresql - 我如何将 Postgres DateRange 类型与 TypeOrm 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58588463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com