Zum Hauptinhalt springen

Postgres / CockroachDB

Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

PostgreSQL, CockroachDB und Amazon Aurora Postgres werden als TypeORM-Treiber unterstützt.

PostgreSQL-kompatible Datenbanken können ebenfalls mit TypeORM über den postgres-Datenquellentyp verwendet werden.

Für YugabyteDB siehe deren ORM-Dokumentation für den Einstieg. Beachten Sie, dass einige TypeORM-Funktionen aufgrund nicht unterstützter Postgres-Features in YugabyteDB eingeschränkt sein können.

Installation

npm install pg

Für Streaming-Unterstützung:

npm install pg-query-stream

Datenquellen-Optionen

Siehe Datenquellen-Optionen für allgemeine Konfiguration. Verwenden Sie den Datenquellentyp postgres, cockroachdb oder aurora-postgres für Verbindungen zu den jeweiligen Datenbanken.

  • url - Verbindungs-URL, über die die Verbindung hergestellt wird. Beachten Sie, dass andere Datenquellen-Optionen Parameter aus der URL überschreiben.

  • host - Datenbank-Host.

  • port - Port des Datenbank-Hosts. Der Standard-Postgres-Port ist 5432.

  • username - Datenbank-Benutzername.

  • password - Datenbank-Passwort.

  • database - Datenbankname.

  • schema - Schema-Name. Standard ist "public".

  • connectTimeoutMS - Millisekunden bis zum Timeout beim initialen Verbindungsaufbau zum Postgres-Server. Bei undefined oder 0 gibt es kein Timeout. Standardwert: undefined.

  • ssl - Objekt mit SSL-Parametern. Siehe TLS/SSL.

  • uuidExtension - Postgres-Erweiterung zur UUID-Generierung. Standard ist uuid-ossp. Kann auf pgcrypto geändert werden, falls uuid-ossp nicht verfügbar ist.

  • poolErrorHandler - Funktion, die aufgerufen wird, wenn der zugrundeliegende Pool einen 'error'-Event auslöst. Nimmt eine Fehlerinstanz entgegen und protokolliert standardmäßig mit warn-Level.

  • maxTransactionRetries - Maximale Anzahl von Transaktionswiederholungen bei 40001-Fehlern. Standard: 5.

  • logNotifications - Boolescher Wert, ob Hinweismeldungen und Benachrichtigungsereignisse des Servers in Client-Logs mit info-Level erscheinen sollen (Standard: false).

  • installExtensions - Boolescher Wert zur Steuerung der automatischen Installation notwendiger Postgres-Erweiterungen (Standard: true).

  • extensions - Liste zusätzlicher Postgres-Erweiterungen für die Installation in der Datenbank (Standard: undefined).

  • applicationName - Zeichenfolge, die in Statistiken und Logs zur Zuordnung von Anwendungen zu Verbindungen sichtbar ist (Standard: undefined).

  • parseInt8 - Boolescher Wert zur Aktivierung der Verarbeitung von 64-Bit-Ganzzahlen (int8) als JavaScript-Zahlen. Standardmäßig werden int8-Werte als Strings zurückgegeben, um Überläufe zu vermeiden. JavaScript-Zahlen folgen IEEE-754 und verlieren Präzision jenseits von Number.MAX_SAFE_INTEGER = +2^53. Für den vollen 64-Bit-Bereich arbeiten Sie mit Strings oder konvertieren Sie zu nativen bigint.

Weitere Optionen können im extra-Objekt hinzugefügt und direkt an die Client-Bibliothek übergeben werden. Details in der pg-Dokumentation für Pool und Client.

Spaltentypen

Spaltentypen für postgres

int, int2, int4, int8, smallint, integer, bigint, decimal, numeric, real, float, float4, float8, double precision, money, character varying, varchar, character, char, text, citext, hstore, bytea, bit, varbit, bit varying, timetz, timestamptz, timestamp, timestamp without time zone, timestamp with time zone, date, time, time without time zone, time with time zone, interval, bool, boolean, enum, point, line, lseg, box, path, polygon, circle, cidr, inet, macaddr, macaddr8, tsvector, tsquery, uuid, xml, json, jsonb, jsonpath, int4range, int8range, numrange, tsrange, tstzrange, daterange, int4multirange, int8multirange, nummultirange, tsmultirange, tstzmultirange, multidaterange, geometry, geography, cube, ltree, vector, halfvec.

Spaltentypen für cockroachdb

array, bool, boolean, bytes, bytea, blob, date, numeric, decimal, dec, float, float4, float8, double precision, real, inet, int, integer, int2, int8, int64, smallint, bigint, interval, string, character varying, character, char, char varying, varchar, text, time, time without time zone, timestamp, timestamptz, timestamp without time zone, timestamp with time zone, json, jsonb, uuid

Hinweis: CockroachDB gibt alle numerischen Datentypen als string zurück. Wenn Sie den Spaltentyp jedoch weglassen und Ihre Eigenschaft als number definieren, konvertiert die ORM den String mittels parseInt in eine Zahl.

Vektor-Spalten

Vektor-Spalten ermöglichen Ähnlichkeitssuchen mit PostgresSQL's Vektor-Operatoren:

// L2 distance (Euclidean) - <->
const results = await dataSource.sql`
SELECT id, embedding
FROM post
ORDER BY embedding <-> ${"[1,2,3]"}
LIMIT 5`

// Cosine distance - <=>
const results = await dataSource.sql`
SELECT id, embedding
FROM post
ORDER BY embedding <=> ${"[1,2,3]"}
LIMIT 5`

// Inner product - <#>
const results = await dataSource.sql`
SELECT id, embedding
FROM post
ORDER BY embedding <#> ${"[1,2,3]"}
LIMIT 5`

Räumliche Spalten (Spatial Columns)

Die PostgreSQL- und CockroachDB-Unterstützung von TypeORM verwendet GeoJSON als Austauschformat. Daher sollten Geometriespalten entweder als object oder Geometry (oder Unterklassen wie Point) gekennzeichnet werden, nachdem Sie geojson-Typen importiert oder die integrierten GeoJSON-Typen von TypeORM verwenden:

import {
Entity,
PrimaryColumn,
Column,
Point,
LineString,
MultiPoint
} from "typeorm"

@Entity()
export class Thing {
@PrimaryColumn()
id: number

@Column("geometry")
point: Point

@Column("geometry")
linestring: LineString

@Column("geometry", {
spatialFeatureType: "MultiPoint",
srid: 4326,
})
multiPointWithSRID: MultiPoint
}

...

const thing = new Thing()
thing.point = {
type: "Point",
coordinates: [116.443987, 39.920843],
}
thing.linestring = {
type: "LineString",
coordinates: [
[-87.623177, 41.881832],
[-90.199402, 38.627003],
[-82.446732, 38.413651],
[-87.623177, 41.881832],
],
}
thing.multiPointWithSRID = {
type: "MultiPoint",
coordinates: [
[100.0, 0.0],
[101.0, 1.0],
],
}

TypeORM versucht, das Richtige zu tun, aber es ist nicht immer möglich zu bestimmen, wenn ein einzufügender Wert oder das Ergebnis einer PostGIS-Funktion als Geometrie behandelt werden sollte. Daher könnte es vorkommen, dass Sie Code ähnlich dem Folgenden schreiben müssen, wo Werte in PostGIS-geometry aus GeoJSON konvertiert und als json in GeoJSON zurückgewandelt werden:

import { Point } from "typeorm"

const origin: Point = {
type: "Point",
coordinates: [0, 0],
}

await dataSource.manager
.createQueryBuilder(Thing, "thing")
// convert stringified GeoJSON into a geometry with an SRID that matches the
// table specification
.where(
"ST_Distance(geom, ST_SetSRID(ST_GeomFromGeoJSON(:origin), ST_SRID(geom))) > 0",
)
.orderBy(
"ST_Distance(geom, ST_SetSRID(ST_GeomFromGeoJSON(:origin), ST_SRID(geom)))",
"ASC",
)
.setParameters({
// stringify GeoJSON
origin: JSON.stringify(origin),
})
.getMany()

await dataSource.manager
.createQueryBuilder(Thing, "thing")
// convert geometry result into GeoJSON, treated as JSON (so that TypeORM
// will know to deserialize it)
.select("ST_AsGeoJSON(ST_Buffer(geom, 0.1))::json geom")
.from("thing")
.getMany()