Inleiding
Zoals u wellicht weet, is PostgreSQL ontworpen voor uitbreidbaarheid en maatwerk, dit betekent dat we de functionaliteit van uw database kunnen uitbreiden met behulp van extensies. De functionaliteit van de PostgreSQL-extensie maakt het mogelijk om meerdere SQL-objecten samen te bundelen in een enkel pakket dat kan worden geladen of verwijderd uit uw database. Als je het eenmaal in je database hebt geladen, kunnen extensies functioneren als ingebouwde functies.
PostgreSQL-database heeft veel functies en biedt een breed scala aan gegevenstypen, functies, operators enz. Maar soms is het niet genoeg voor sommige gebruikssituaties. We kunnen de functionaliteit van PostgreSQL eenvoudig uitbreiden door middel van extensies. Dit is een zeer nuttige functie voor databaseontwikkelaars en beheerders.
In deze blog kunnen we twee dingen hieronder bespreken.
- Hoe de door de PostgreSQL-community ondersteunde extensie te gebruiken
- Extensies maken en gebruiken in PostgreSQL
Hoe door PostgreSQL door de community ondersteunde extensies te gebruiken
Er zijn een aantal contrib-modules/extensies in PostgreSQL. Deze modules worden onderhouden door de PostgreSQL-gemeenschap. We kunnen deze modules en de functionaliteit ervan in PostgreSQL gebruiken door een extensie te maken.
Laten we eens kijken hoe we de functionaliteit van de hstore-extensie in PostgreSQL kunnen gebruiken.
Hstore-extensie
De hstore-module implementeert het hstore-gegevenstype dat sleutel-waardeparen in één waarde opslaat. We kunnen het hstore-gegevenstype in veel gevallen gebruiken, zoals semi-gestructureerde gegevens of rijen met veel attributen die zelden worden opgevraagd. Houd er rekening mee dat sleutels en waarden alleen tekstreeksen zijn. Om deze functionaliteit te gebruiken, moeten we er een extensie voor maken in PostgreSQL.
Laten we eens kijken hoe we het gegevenstype hstore kunnen gebruiken.
CREATE TABLE books (
book_code serial primary key,
book_title VARCHAR (20),
attr hstore
);
Voordat u het hstore-gegevenstype maakt, moet u de hstore-extensie inschakelen die de contrib-module naar uw PostgreSQL laadt.
CREATE EXTENSION hstore;
Er zijn verschillende hstore-functies om gegevens uit de database op te halen. U kunt de functies en voorbeelden hier bekijken.
Controleer de extra meegeleverde modules in PostgreSQL.
Een extensie maken
Uitbreidbaarheid is een van de krachtigste functies in PostgreSQL. U kunt nieuwe functionaliteit voor een bepaalde use case toevoegen door de contrib-module te gebruiken en deze te installeren met CREATE EXTENSION.
In deze sectie gaan we leren hoe u een eenvoudige contrib-module kunt maken en hoe u de functionaliteit ervan in PostgreSQL kunt gebruiken.
Extensiebestanden
Om de opdracht CREATE EXTENSION in uw database te kunnen uitvoeren, moet uw extensie ten minste twee bestanden nodig hebben:
- Besturingsbestand
Het bestandsformaat moet extension_name.control zijn, dat de basis vertelt over de extensie naar PostgreSQL, en het moet in de SHAREDIR/extensie-directory van de installatie worden geplaatst. - SQL-scriptbestand
Het bestand met de extensie--version.sql bevat de functies die u wilt toevoegen.
Het bestandsformaat van het controlebestand in de extensie is hetzelfde als het bestand postgresql.conf, namelijk een lijst met parameter_name =waardetoewijzingen, één per regel.
Voorbeeld
Controleer het onderstaande complete voorbeeld van een alleen-SQL-extensie, maak een Oracle-compatibele NVL-functie in PostgreSQL. Er zijn veel gevallen, maar hier kunnen we bijvoorbeeld slechts één geval beschouwen.
Het SQL-scriptbestand nvlfunc--1.0.sql ziet er als volgt uit...
Nvlfunc--1.0.sql-bestand:
--complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION nvlfunc" to load this file. \quit
CREATE OR REPLACE FUNCTION public.NVL(SMALLINT,SMALLINT)
RETURNS SMALLINT AS $$
SELECT COALESCE($1,$2);
$$ LANGUAGE SQL IMMUTABLE;
Het controlebestand nvlfunc ziet er als volgt uit...
Nvlfunc.conntrol-bestand:
# nvlfunc extension
comment = 'Oracle compatible nvl function'
default_version = '1.0'
module_pathname = '$libdir/nvlfunc'
relocatable = false
Hoewel je nauwelijks een makefile nodig hebt om deze bestanden in de juiste map te installeren, zou je een Makefile kunnen gebruiken die dit bevat:
Makefile:
EXTENSION = nvlfunc
DATA = nvlfunc--1.0.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
Als je de functie hebt geïmplementeerd met de taal 'C', dan moet je het bestand toevoegen aan de makefile.
Installatie
De opdracht make install zal het controlebestand en het sql-scriptbestand in de juiste map installeren, zoals gerapporteerd door pg_config.
Nadat de bestanden zijn geïnstalleerd, gebruikt u de opdracht CREATE EXTENSION om de objecten in een bepaalde database in PostgreSQL te laden.
Controleer de volgende stappen om de nvlfunc-extensie te installeren en u kunt dit bestand ook toevoegen aan uw extensiemap:
INSTALL.nvlfunc-bestand:
This module is a PostgreSQL extension which provides the Oracle compatible nvl function feature.
Use below command in source directory of nvlfunc to install the module.
make install
Then use the below command to create extension nvlfunc in database.
CREATE EXTENSION nvlfunc;
Use the below command to remove the nvlfunc extension from database.
DROP EXTENSION nvlfunc;
Use below command in source directory of nvlfunc to uninstall the module.
make uninstall
Note:
This extension module requires PostgreSQL 9.1 or later because CREATE EXTENSION
feature is available in PostgreSQL 9.1 and later version.
PostgreSQL-extensies moeten in uw database zijn geïnstalleerd voordat u hun functionaliteit kunt gebruiken. Om een bepaalde extensie te installeren, voert u de opdracht CREATE EXTENSION van psql uit om de verpakte objecten in de database te laden.
Download de whitepaper vandaag PostgreSQL-beheer en -automatisering met ClusterControlLees wat u moet weten om PostgreSQL te implementeren, bewaken, beheren en schalenDownload de whitepaperTesten
Nadat u de extensie hebt gemaakt, is het raadzaam om een testcase voor die extensie te maken, zodat u, wanneer u deze module in een andere PostgreSQL-versie installeert, kunt controleren of alle testcases werken zoals verwacht of niet.
Dit is een optionele stap, maar u kunt deze zelf maken. De testgevallen zien er als volgt uit:
sql/nvlfunc.sql-bestand:
SELECT NVL(NULL::SMALLINT, 11::SMALLINT);
Vervolgens kunt u de verwachte uitvoer in een ander bestand toevoegen. Het verwachte uitvoerbestand ziet er als volgt uit:
verwacht/nvlfunc.out-bestand:
SELECT NVL(NULL::SMALLINT, 11::SMALLINT);
nvl
-----
11
(1 row)
Dit is slechts één voorbeeld, daarom is er maar één testcase toegevoegd. Maar wanneer u een nieuwe extensie maakt, kunt u meer testgevallen toevoegen.
Nvlfunc-extensie directorystructuur:
# mkdir nvlfunc
# cd nvlfunc
# ls
Makefile nvlfunc.control nvlfunc--1.0.sql sql expected INSTALL.nvlfunc README
Pluspunten
- Eenvoudig om de PostgreSQL-functionaliteit uit te breiden
- Zeer eenvoudig om de extensie te maken en te installeren
- Eenvoudig te testen op regressies op verschillende versies van PostgreSQL
Nadelen
- Er zijn geen speciale nadelen, maar test de functie die u toevoegt aan de extensie voordat u deze gebruikt.
Conclusie
PostgreSQL-uitbreidbaarheid is een zeer krachtige functie, u kunt uw eigen extensie maken voor bepaalde gebruikssituaties en deze gebruiken in uw productiedatabase. Er zijn veel extensies die door de PostgreSQL-gemeenschap worden ondersteund, zoals hstore, postgres_fdw, dblink enz. en extensies van derden, zoals Orafce, die allemaal worden gebruikt voor specifieke gebruikssituaties.