Dans le monde d'aujourd'hui, PostgreSQL a acquis une grande importance dans divers aspects de la vie quotidienne. Tant sur le plan personnel que professionnel, la présence de PostgreSQL est devenue un facteur déterminant qui façonne nos décisions, opinions et comportements. Avec les progrès de la technologie et de la mondialisation, PostgreSQL a réussi à transcender les frontières et les barrières culturelles, devenant un sujet d'intérêt général et un point de rencontre pour la société moderne. De son impact sur l’économie à son influence sur la politique et la culture, PostgreSQL a tissé un réseau de connexions qui touche tous les coins de la planète. Dans cet article, nous explorerons de près le rôle fondamental que joue PostgreSQL dans notre vie quotidienne et comment il a réussi à s'imposer comme un élément clé dans l'évolution de la société actuelle.
| Créateur | Michael Stonebraker |
|---|---|
| Développé par | PostgreSQL Global Development Group (d), Peter Eisentraut (d), Tom Lane (en), Bruce Momjian (d) et Marc Fournier (d) |
| Première version | |
| Dernière version | 18.1 ()[1] |
| Dépôt | git.postgresql.org/gitweb/?p=postgresql.git |
| Écrit en | C |
| Système d'exploitation | FreeBSD, OpenBSD, Linux, macOS, Solaris, Microsoft Windows et type Unix |
| Type |
Système de gestion de base de données relationnelle (en) Serveur SQL (d) |
| Politique de distribution | Gratuit |
| Licence | Licence PostgreSQL (d) |
| Site web | www.postgresql.org |
PostgreSQL, aussi connu sous le nom de Postgres, est un système de gestion de base de données relationnelle et objet (SGBDRO). C'est un outil libre disponible selon les termes d'une licence de type BSD mettant l’accent sur l’extensibilité et la conformité avec SQL. Il prend en charge les transactions avec les propriétés ACID (Atomicité, Cohérence, Isolation, Durabilité) et offre des fonctionnalités avancées telles que les vues automatiquement mises à jour, les vues matérialisées (materialized views), les déclencheurs (trigger), les clés étrangères (foreign keys) et les procédures stockées (stored procedures)[3]. PostgreSQL est compatible avec les principaux systèmes d’exploitation, notamment Windows, Linux, macOS, FreeBSD et OpenBSD. Il peut gérer une grande variété de charges de travail, allant des bases de données sur une seule machine aux entrepôts de données, aux data lakes[4] et aux services web avec de nombreux utilisateurs simultanés.
PostgreSQL est comparable à d'autres systèmes de gestion de base de données, qu'ils soient libres (comme MariaDB et Firebird), ou propriétaires (comme Oracle, MySQL, Sybase, DB2, Informix et Microsoft SQL Server). Comme les projets libres Apache et Linux, PostgreSQL n'est pas contrôlé par une seule entreprise, mais est fondé sur une communauté mondiale de développeurs et d'entreprises.
Le PostgreSQL Global Development Group[5] se concentre exclusivement sur le développement du moteur de base de données et des composants étroitement liés. Ce noyau constitue techniquement PostgreSQL lui-même, mais une vaste communauté de développeurs et un écosystème fournissent de nombreuses fonctionnalités supplémentaires qui, traditionnellement, seraient proposées par un éditeur de logiciel propriétaire. Cela inclut des fonctionnalités spécifiques, comme le support des bases de données géospatiales ou temporelles, ainsi que des extensions permettant d’émuler d’autres systèmes de bases de données. De nombreux outils tiers proposent également des interfaces utilisateur graphiques ainsi que des solutions d’équilibrage de charge et de haute disponibilité[6]. Ces contributions jouent un rôle essentiel dans l’adoption et l’utilisation de PostgreSQL, constituant ainsi un vaste écosystème autour du moteur de base de données.
L'histoire de PostgreSQL remonte à la base de données Ingres, développée à Berkeley par Michael Stonebraker. Lorsque ce dernier décida en 1985 de recommencer le développement de zéro, il nomma le logiciel Postgres, comme raccourci de post-Ingres. Lors de l'ajout des fonctionnalités SQL en 1995, Postgres fut renommé Postgres95. Ce nom fut changé à la fin de 1996 en PostgreSQL.
Le projet est organisé de manière à maintenir plusieurs versions stables en parallèle, ainsi qu'un dépôt mis à jour en continu[7]. Cette pratique est extrêmement appréciable pour les productions des systèmes informatiques car elle leur permet de lisser les besoins de migration obligée de leurs applications qui utilisent des bases de données sur les moments de faible charge et de disponibilités de leurs ressources. Elles réalisent ainsi de très sérieuses économies, puisqu'on estime en moyenne que cette charge représente au moins 40 %, mais le plus souvent jusqu'à 60 % des coûts de fonctionnement des organisations informatiques au sein des entreprises.[réf. nécessaire]
Ce SGBDRO utilise des types de données modernes, dits composés ou enrichis suivant les terminologies utilisées dans le vocable informatique usuel. Ceci signifie que PostgreSQL peut stocker plus de types de données que les types simples traditionnels entiers, caractères, etc. L'utilisateur peut créer des types, des fonctions, utiliser l'héritage de type, etc.
PostgreSQL est plus avancé que ses concurrents dans la conformité aux standards SQL (énoncé vrai entre 2012 et 2015). PostgreSQL est pratiquement conforme (de plus en plus conforme) aux normes ANSI SQL 89, SQL 92 (SQL 2), SQL 99 (SQL 3), SQL:2003 et SQL:2008[8]. Il fonctionne sur diverses plates-formes matérielles et sous différents systèmes d'exploitation.
PostgreSQL fonctionne sur Solaris, SunOS, macOS, HP-UX, AIX, Linux, IRIX, Digital Unix, BSD, NetBSD, FreeBSD, OpenBSD, SCO unix, NeXTSTEP, UnixWare et toutes sortes d'Unix. Depuis la version 8.0, PostgreSQL fonctionne également nativement sur Windows. Avant la version 8, il fallait une couche de compatibilité POSIX (par exemple cygwin) pour faire fonctionner PostgreSQL sur ce système d'exploitation.
PostgreSQL est largement reconnu pour son comportement stable, proche de Oracle, mais aussi pour ses possibilités de programmation étendues, directement dans le moteur de la base de données, via PL/pgSQL. Le traitement interne des données peut aussi être couplé à d'autres modules externes compilés dans d'autres langages.
Outre sa capacité à gérer des bases de données volumineuses[9], PostgreSQL est souvent utilisé pour sa capacité à gérer des bases de données spatiales (SIG), grâce à son extension PostGIS qui intègre une riche bibliothèque de fonctions géographiques.
PostgreSQL gère la concurrence grâce au contrôle de concurrence multiversion ou Multiversion concurrency control (MVCC), en attribuant à chaque transaction une vue cohérente et isolée de l'état de la base de données à un instant donné, ce qui permet d'apporter des modifications sans affecter les autres transactions. Cela élimine en grande partie la nécessité d'utiliser des verrous en lecture et garantit que la base de données respecte les principes ACID (Atomicité, Cohérence, Isolation, Durabilité). PostgreSQL propose quatre niveaux d'isolation des transactions : Read Uncommitted, Read Committed, Repeatable Read et Serializable. Étant donné que PostgreSQL est protégé contre les lectures sales, demander un niveau d'isolation des transactions Read Uncommitted renvoie en réalité un niveau Read Committed. PostgreSQL supporte un ordonnancement complet (ou Serializability) grâce à la méthode de serializable snapshot isolation (SSI)[10]. L'implémentation du MVCC dans PostgreSQL peut rencontrer des problèmes de performance nécessitant un réglage lorsqu'elle est soumise à une charge d'écriture importante, particulièrement lors de la mise à jour de lignes existantes[11].
PostgreSQL intègre une réplication[12] binaire native basée sur l’envoi des modifications, que l'on nomme des journaux de reprise anticipée ou Write-Ahead Logs (WAL), vers des nœuds répliqués de manière asynchrone. Ces nœuds permettent d’exécuter des requêtes en lecture seule, ce qui facilite la répartition du trafic de lecture entre plusieurs serveurs. Auparavant, les solutions de réplication offrant une mise à l’échelle similaire des lectures s’appuyaient généralement sur l’ajout de déclencheurs de réplication sur le serveur principal, augmentant ainsi sa charge.
PostgreSQL inclut également une réplication synchrone intégrée[13] qui garantit que, pour chaque transaction d’écriture, le serveur principal attend qu’au moins un nœud répliqué ait écrit les données dans son journal des transactions. Contrairement à d’autres systèmes de bases de données, PostgreSQL permet de spécifier le niveau de durabilité d’une transaction (asynchrone ou synchrone) selon plusieurs critères : par base de données, par utilisateur, par session ou même par transaction. Cela s’avère utile pour certaines charges de travail ne nécessitant pas de telles garanties, car la réplication synchrone peut affecter les performances en raison de l'attente de confirmation du serveur de secours.
Les serveurs de secours, également appelés serveurs en attente, peuvent être synchrones ou asynchrones. Dans le cadre de la réplication synchrone, la configuration permet de spécifier les serveurs candidats. Le premier serveur de la liste qui assure un flux actif devient le serveur synchrone principal. En cas de panne, le système bascule automatiquement vers le serveur suivant dans la liste. Le terme serveur de secours est généralement utilisé lorsqu'il s'agit de haute disponibilité et de basculement automatique en cas de panne, tandis que serveur d'attente (standby server) désigne plutôt un serveur qui reste passif et ne prend le relais qu'en cas de besoin.
La réplication synchrone multi-maître n’est pas incluse dans le cœur de PostgreSQL. Cependant, Postgres-XC, basé sur PostgreSQL, fournit une réplication multi-maître synchrone évolutive et est distribué sous la même licence que PostgreSQL. Un projet associé, Postgres-XL, propose des fonctionnalités similaires, tandis que Postgres-R est un autre fork axé sur la réplication. La réplication bidirectionnelle (BDR) est un système de réplication multi-maître asynchrone pour PostgreSQL[14].
Des outils comme repmgr simplifient la gestion des clusters de réplication.
Plusieurs solutions de réplication asynchrone basées sur des déclencheurs restent pertinentes malgré l’introduction des capacités natives de réplication binaire, notamment dans les cas où la réplication complète d’un cluster de bases de données n’est pas appropriée. Parmi ces solutions :
PostgreSQL intègre en natif la prise en charge des index classiques de type B-tree et table de hachage (hash table), ainsi que quatre méthodes d'accès aux index :
En plus de ces types d'indexation, PostgreSQL permet la création de méthodes d'indexation définies par l'utilisateur, bien que ce processus soit complexe. PostgreSQL prend également en charge plusieurs fonctionnalités avancées en matière d'indexation :
WHERE dans la commande CREATE INDEX. Cela permet de limiter la taille de l'index et d'améliorer les performances.Les schémas PostgreSQL sont des espaces de noms permettant à des objets du même type et portant le même nom de coexister dans une seule base de données. Ils ne doivent pas être confondus avec un schéma de base de données (ou database schema), qui est une spécification abstraite, structurelle et organisationnelle définissant la relation des données de chaque table avec celles des autres tables. Tous les objets d'une base de données PostgreSQL, à l'exception de quelques objets globaux tels que les rôles et les tablespaces, existent au sein d'un schéma. Les schémas ne peuvent pas être imbriqués, un schéma ne peut pas contenir un autre schéma. Le système de permissions contrôle l'accès aux schémas et à leur contenu.
Par défaut, les bases de données nouvellement créées ne comportent qu'un seul schéma appelé public, mais d'autres schémas peuvent être ajoutés, et l'utilisation du schéma public n'est pas obligatoire.
Un paramètre search_path détermine l'ordre dans lequel PostgreSQL recherche les objets non qualifiés (ceux qui ne sont pas précédés d’un schéma). Par défaut, il est défini sur $user, public ($user faisant référence à l'utilisateur actuellement connecté à la base de données). Ce paramètre par défaut peut être défini au niveau d’une base de données ou d’un rôle, mais étant un paramètre de session, il peut être librement modifié (même plusieurs fois) au cours d'une session client, affectant uniquement cette session.
Les schémas inexistants ou non accessibles à l'utilisateur connecté, qui sont répertoriés dans search_path, sont ignorés lors de la recherche d’objets.
Les nouveaux objets sont créés dans le premier schéma valide (accessible) apparaissant dans search_path.
PostgreSQL prend en charge une large variété de types de données natifs, notamment :
Les utilisateurs peuvent créer leurs propres types de données, qui peuvent être pleinement indexables grâce aux infrastructures d'indexation de PostgreSQL, comme GiST, GIN et SP-GiST. Un exemple notable est l'intégration des types de données pour les systèmes d'information géographique (SIG) ou en anglais Geographic information system (GIS) via le projet PostGIS.
Il existe également un type de données appelé domaine, qui fonctionne comme un autre type de données mais avec des contraintes supplémentaires définies par son créateur. Toute donnée insérée dans une colonne utilisant ce domaine devra respecter ces contraintes.
PostgreSQL propose aussi des types de plages, qui permettent de représenter des intervalles de données :
Les types de plages intégrés incluent les entiers, grands entiers, nombres décimaux, timestamps (avec ou sans fuseau horaire) et dates.
Il est également possible de créer des plages personnalisées, par exemple :
inetfloatLes plages prennent en charge les bornes inclusives et exclusives grâce aux caractères et () :
[4,9) inclut 4 à 8 mais exclut 9Les types de plage sont compatibles avec les opérateurs d'inclusion, de chevauchement et de position relative pour faciliter les comparaisons et les recherches.
PostgreSQL permet la création de nouveaux types d'objets au sein de la base de données, offrant une grande flexibilité pour l'extension des fonctionnalités natives.
Grâce à ces fonctionnalités, PostgreSQL est hautement extensible, permettant d'adapter la base de données à des besoins spécifiques.
Les tables peuvent hériter des caractéristiques d’une table parente[23]. Les données des tables enfants apparaissent comme si elles faisaient partie de la table parente, sauf si la sélection est effectuée en utilisant le mot-clé ONLY, par exemple : SELECT * FROM ONLY parent_table;. L’ajout d’une colonne à la table parente entraîne automatiquement son apparition dans la table enfant.
L'héritage peut être utilisé pour mettre en œuvre le partitionnement des tables, en employant des déclencheurs (triggers) ou des règles pour rediriger les insertions vers la table parente et les distribuer vers les bonnes tables enfants.
Cependant, cette fonctionnalité n'est pas totalement prise en charge. En particulier, les contraintes ne sont pas toutes héritables. Les contraintes CHECK et NOT NULL définies sur une table parente sont automatiquement héritées par ses tables enfants. En revanche, d'autres types de contraintes (UNIQUE, PRIMARY KEY et FOREIGN KEY) ne sont pas hérités.
L’héritage permet de modéliser directement les hiérarchies de généralisation représentées dans les diagrammes entité-association (DEA) ou en anglais Entity–relationship model (ERDs) au sein de la base de données PostgreSQL.
pg_upgrade pour réduire le temps d’indisponibilité[24]PostgreSQL permet de se connecter à d’autres systèmes pour récupérer des données via des foreign data wrappers (FDW)[25]. Ceux-ci peuvent prendre la forme de n'importe quelle source de données, telle qu'un système de fichiers, un autre système de gestion de base de données relationnelle (SGBDR) ou un service web. Cela permet aux requêtes de base de données classiques d’utiliser ces sources de données comme des tables ordinaires, et même d’effectuer des jointures entre plusieurs sources de données.
PostgreSQL prend en charge un protocole de communication binaire qui permet aux applications de se connecter au serveur de base de données. Ce protocole est actualisé à chaque version (actuellement la version 3.0 depuis PostgreSQL 7.4) et dispose d’une spécification détaillée.
L'implémentation officielle de ce protocole de communication est une API C, libpq[26]. De plus, l'outil officiel ECPG permet d’intégrer des commandes SQL dans du code C. Les deux sont inclus dans la distribution standard de PostgreSQL[27].
Des bibliothèques tierces pour connecter PostgreSQL sont disponibles pour de nombreux langages de programmation, notamment C++, Java, Julia, Python, Node.js, Go et Rust.
Les langages procéduraux permettent aux développeurs d'étendre la base de données avec des sous-programmes personnalisés (fonctions), souvent appelées procédures stockées. Ces fonctions peuvent être utilisées pour créer des déclencheurs de base de données ou triggers (fonctions invoquées lors de la modification de certaines données), ainsi que des types de données personnalisés et des fonctions d'agrégation[28]. Les langages procéduraux peuvent également être invoqués sans définir de fonction, en utilisant la commande DO au niveau SQL[29].
Les langages sont divisés en deux groupes :
PostgreSQL prend en charge trois langages procéduraux intégrés :
En outre, PostgreSQL permet de charger des langages procéduraux dans la base de données via des extensions. Trois extensions de langages sont incluses avec PostgreSQL pour prendre en charge Perl, Tcl et Python. Pour Python, la version actuelle est Python 3, tandis que la version Python 2 a été abandonnée à partir de PostgreSQL 15. Les versions anciennes et nouvelles ne pouvaient pas être utilisées dans la même session auparavant. Des projets externes fournissent un support pour de nombreux autres langages[31], tels que PL/Java, JavaScript (PL/V8), PL/Julia[32], PL/R, PL/Ruby, et d'autres.
Les déclencheurs sont des événements activés par l'exécution d'instructions SQL de manipulation de données (DML). Par exemple, une instruction INSERTpeut déclencher une vérification automatique de la validité des valeurs insérées. La plupart des déclencheurs sont activés par des instructions INSERTou UPDATE.
PostgreSQL prend en charge les déclencheurs de manière complète et permet de les attacher aux tables. Les déclencheurs peuvent être par colonne et conditionnels : un déclencheur UPDATE peut cibler des colonnes spécifiques d'une table et être exécuté uniquement sous certaines conditions définies dans une clause WHERE. Il est également possible d'attacher des déclencheurs aux vues en utilisant la condition INSTEAD OF.
Si plusieurs déclencheurs sont définis sur un même événement, ils sont exécutés dans l’ordre alphabétique de leur nom. En plus des fonctions écrites en PL/pgSQL, les déclencheurs peuvent invoquer des fonctions écrites dans d'autres langages comme PL/Python ou PL/Perl.
PostgreSQL propose un système de messagerie asynchrone accessible via les commandes NOTIFY, LISTEN et UNLISTEN. Une session peut émettre une commande NOTIFY sur un canal spécifié avec une charge utile optionnelle pour signaler un événement particulier. D'autres sessions peuvent détecter ces événements en exécutant la commande LISTEN sur ce même canal.
Ce mécanisme permet d'éviter les interrogations répétées (attente active ou polling) par les applications pour détecter des modifications, réduisant ainsi la charge inutile sur le système. Il peut être utilisé pour informer d'autres sessions lorsqu'une table est mise à jour ou pour synchroniser des applications distinctes en réponse à certaines actions.
Les notifications sont totalement transactionnelles : elles ne sont envoyées qu'une fois la transaction confirmée (COMMIT), ce qui empêche l'envoi de messages pour des actions annulées (ROLLBACK).
De nombreux connecteurs PostgreSQL prennent en charge ce système de notifications, notamment libpq, JDBC, Npgsql, psycopg et Node.js, facilitant son intégration avec des applications externes. PostgreSQL peut également être utilisé comme un serveur de messagerie pub/sub ou un serveur de tâches en combinant LISTEN avec FOR UPDATE SKIP LOCKED[33],[34],[35].
Les règles permettent de réécrire l’arbre de requête d’une requête entrante. Elles fonctionnent comme un langage de macro pour SQL, s’exécutant automatiquement. Les "Query Re-Write Rules" sont attachées à une table ou une classe et modifient les requêtes SELECT, INSERT, UPDATEet DELETE avant leur exécution. Ces règles peuvent soit remplacer la requête originale, soit s’exécuter en complément de celle-ci.
Le processus de réécriture des requêtes intervient après l’analyse syntaxique (parsing) mais avant l’optimisation et l’exécution.
Toutefois, la majorité des fonctionnalités offertes par les règles ont été remplacées par des triggers, qui sont généralement préférés en raison de leur comportement plus prévisible et plus facile à gérer que les règles équivalentes.
Le serveur PostgreSQL est basé sur des processus (et non sur des threads), utilisant un processus du système d'exploitation par session de base de données. Plusieurs sessions sont automatiquement réparties sur tous les CPU disponibles par le système d'exploitation. De nombreux types de requêtes peuvent également être parallélisées sur plusieurs processus de travail en arrière-plan, permettant de tirer parti de plusieurs CPU ou cœurs[38]. Les applications clientes peuvent utiliser des threads et créer plusieurs connexions à la base de données depuis chaque thread[39].
PostgreSQL gère sa sécurité interne sur une base par rôle (ou role-oriented programming). Un rôle est généralement considéré comme un utilisateur (un rôle pouvant se connecter) ou un groupe (un rôle dont d'autres rôles sont membres). Des permissions peuvent être accordées ou révoquées sur n'importe quel objet, jusqu'au niveau de la colonne, et peuvent permettre ou empêcher la visibilité/la création/la modification/la suppression d'objets au niveau de la base de données, du schéma, de la table et des lignes.
La fonctionnalité SECURITY LABEL[40],[41] de PostgreSQL (extension aux standards SQL) permet une sécurité supplémentaire avec un module chargeable intégré qui supporte un contrôle d'accès obligatoire (MAC), basé sur la politique de sécurité Security-Enhanced Linux (SELinux).[42],[43]
PostgreSQL prend en charge nativement un large éventail de mécanismes d'authentification externes, notamment :
Les méthodes GSSAPI, SSPI, Kerberos, peer, ident et certificat peuvent également utiliser un fichier map spécifié qui liste quels utilisateurs, correspondant à ce système d'authentification, sont autorisés à se connecter en tant qu'utilisateur de la base de données spécifique.
Ces méthodes sont spécifiées dans le fichier de configuration d'authentification basé sur l'hôte du cluster pg_hba.conf, qui détermine quelles connexions sont autorisées. Cela permet de contrôler quel utilisateur peut se connecter à quelle base de données, d'où ils peuvent se connecter (adresse IP, plage d'adresses IP, socket de domaine), quel système d'authentification sera appliqué, et si la connexion doit utiliser le protocole Transport Layer Security (TLS).
PostgreSQL revendique une conformité élevée, mais pas complète, avec la dernière norme SQL ("à partir de la version 17, sortie en septembre 2024, PostgreSQL respecte au moins 170 des 177 fonctionnalités obligatoires pour la conformité au noyau SQL:2023 (en)", et aucune autre base de données n'est totalement conforme à cette norme[45]). Une exception concerne la gestion des identifiants non entre guillemets comme les noms de tables ou de colonnes. Dans PostgreSQL, ces identifiants sont convertis en minuscules en interne[46], alors que la norme stipule que les identifiants non entre guillemets doivent être convertis en majuscules. D'autres lacunes concernent l'absence de tables temporelles permettant l'enregistrement automatique des versions de lignes pendant les transactions, avec la possibilité de naviguer dans le temps (prédicat FOR SYSTEM TIME), bien que des extensions tierces relativement conformes aux normes SQL soient disponibles[47].
Depuis 2015, PostgreSQL a connu des améliorations significatives en termes de performances et de scalabilité.
PostgreSQL 16 publiée en septembre 2024, cette version a apporté des améliorations notables en matière de sécurité et de performance. Les benchmarks montrent des gains significatifs par rapport aux versions précédentes, notamment PostgreSQL 13[48].
La comparaison avec MySQL indique selon des études récentes que, pour la plupart des charges de travail, les performances de PostgreSQL et de MySQL sont comparables, avec des variations allant jusqu'à 30 %. Cependant, MySQL peut avoir un avantage dans les charges de travail extrêmement intensives en écriture[49].
La comparaison avec Dolt et MySQL publié en décembre 2023 par AWS a évalué PostgreSQL avec la fonctionnalité Dedicated Log Volume (DLV), montrant des gains de performance via l’outil pgbench[50].
La scalabilité sur les systèmes multi-cœurs de PostgreSQL montre une progression linéaire des performances avec l’augmentation du nombre de cœurs CPU[51].
L'optimisation des requêtes via des techniques comme Lero, basées sur l’apprentissage automatique, réduisent le temps d’exécution des requêtes jusqu'à 70 %[52].
PostgreSQL est disponible pour les systèmes d'exploitation suivants : Linux (toutes les distributions récentes), ARM 64 bits et x86-64 avec des installateurs disponibles et testés pour macOS version 10.14 et plus récentes, Windows (avec des installateurs disponibles et testés pour Windows Server 2022 et 2016 64 bits), FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, et d'autres sans exécutables binaires officiels (mais probablement disponibles de manière non officielle) tels que Solaris et illumos.
PostgreSQL peut être exécuté sur les architectures suivantes (et systèmes d'exploitation) : x86-64 64 bits et x86 32 bits sur Windows et d'autres systèmes d'exploitation ; en plus de Windows, il est également compatible avec : ARM 64 bits[53] et l'ARM 32 bits plus ancien, y compris des versions plus anciennes comme l'ARMv6 sur Raspberry Pi, RISC-V, z/Architecture, S/390, PowerPC (y compris Power ISA 64 bits), SPARC (également 64 bits), MIPS et PA-RISC. Il a également été connu pour fonctionner sur d'autres plateformes, bien qu'il n'ait pas été testé depuis plusieurs années pour les versions récentes[54].
| Exemple de session psql[55] |
|---|
regression=# select foo;
ERROR: column "foo" does not exist
CONTEXT: PL/pgSQL function "test1" while casting return value to function's return type
LINE 1: select foo;
^
regression=# \q
peter@localhost testdb=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
regression=# select '\x';
WARNING: nonstandard use of escape in a string literal
LINE 1: select '\x';
----------
x
(1 row)
regression=# select E'\x';
piro=> \set foo 30;
piro=> select * from test where foo <= :foo;
foo | bar
-----+-----
10 |
20 |
(2 rows)
testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :"foo";
testdb=> \set content `cat my_file.txt`
testdb=> INSERT INTO my_table VALUES (:'content');
regression=# select (
regression(# 1);
?column?
----------
1
(1 row)
piro=> select (
piro(> '
piro'> ' || $$
piro$> $$)
piro-> from "
piro"> foo";
ERROR: relation "
foo" does not exist
LINE 5: from "
^
testdb=> CREATE TABLE my_table (
first integer not null default 0,
second text) ; -- end of command
CREATE TABLE
=# SELECT '0x10'::mpz AS "hex", '10'::mpz AS "dec",
-# '010'::mpz AS oct, '0b10'::mpz AS bin; -- Table output
hex | dec | oct | bin
-----+-----+-----+-----
16 | 10 | 8 | 2
(1 row)
regression=# select schemaname from pg_tables limit 3; -- One field output
schemaname
------------
pg_catalog
pg_catalog
pg_catalog
(3 rows)
=# select 10.0, 1e-6, 1E+6;
?column? | ?column? | ?column?
----------+----------+----------
10.0 | 0.000001 | 1000000
(1 row)
regression=# begin;
BEGIN
regression=# create table asdf (foo serial primary key);
NOTICE: CREATE TABLE will create implicit sequence "asdf_foo_seq" for serial column "asdf.foo"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "asdf_pkey" for table "asdf"
CREATE TABLE
regression=# insert into asdf values (10) returning foo;
foo
-----
10
(1 row)
INSERT 0 1
regression=# ROLLBACK ;
ROLLBACK
|
psql est une interface en ligne de commande psql permettant la saisie de requêtes SQL, directement ou par l'utilisation de procédures stockées. De plus, psql offre un certain nombre de méta-commandes et diverses fonctionnalités semblables à une interface système (ou shell) pour faciliter l'écriture de scripts et l'automatisation d'un large éventail de tâches comme la complétion automatique des noms d'objets et de la syntaxe SQL.
pgAdmin[56] est un outil d'administration d'interface graphique pour PostgreSQL distribué selon les termes de la licence PostgreSQL[57]. Disponible sur plusieurs plateformes, il prend en charge plus d'une douzaine de langues. La deuxième version pgAdmin II a été publiée en janvier 2002. Puis pgAdmin III a été publié en mai 2004, écrit en C++ avec le framework WxWidgets, cette version a permis une compatibilité accrue avec divers systèmes d’exploitation. En septembre 2016[58], pgAdmin 4 a été lancé avec une architecture basée sur le web, utilisant Python (Flask) pour le backend et Qt pour l’interface utilisateur.
phpPgAdmin est une interface web d’administration pour PostgreSQL. L'outil d'administration est écrit en PHP et supporte les différentes branches de PostgreSQL depuis sa version 7. L'interface s'appuie sur des scripts PHP et sur la base de données PostgreSQL pour favoriser les diverses tâches d'administration via le World Wide Web.
PostgreSQL Studio permet aux utilisateurs d'effectuer les principales tâches de développement de bases de données PostgreSQL via une console web. Il facilite le travail avec des bases de données dans le cloud, sans nécessiter l'ouverture de pare-feu[59].
TeamPostgreSQL est une interface web basée sur AJAX/JavaScript pour PostgreSQL. Elle permet d'explorer, gérer et créer des objets de données et des bases de données directement depuis un navigateur web. L'interface comprend un éditeur SQL avec des onglets, l'autocomplétion, des widgets d'édition de lignes, une navigation interactive via les clés étrangères, ainsi qu'un système de favoris pour les scripts fréquemment utilisés. TeamPostgreSQL prend en charge SSH à la fois pour l'interface web et les connexions aux bases de données. Des installateurs sont disponibles pour Windows, Macintosh et Linux, ainsi qu'une archive multiplateforme exécutable via un simple script[60].
LibreOffice Base et OpenOffice.org Base peuvent être utilisés comme interfaces frontales pour PostgreSQL.
pgBadger est un analyseur de journaux pour PostgreSQL, permettant de générer des rapports détaillés à partir des fichiers de logs de la base de données.
pgDevOps est une suite d’outils web permettant d'installer et de gérer plusieurs versions de PostgreSQL, ainsi que ses extensions et composants communautaires. Elle offre aussi des fonctionnalités pour le développement de requêtes SQL, la surveillance des bases de données et l’identification des problèmes de performance[61].
Adminer est un outil d’administration web simple pour PostgreSQL et d’autres bases de données, écrit en PHP.
pgBackRest est un outil de sauvegarde et de restauration pour PostgreSQL, offrant la prise en charge des sauvegardes complètes, différentielles et incrémentales[62].
pgaudit est une extension PostgreSQL permettant d’effectuer un audit détaillé des sessions et des objets via le système de journalisation standard de PostgreSQL[63].
WAL-E est un outil de sauvegarde et de restauration basé sur le mécanisme de journaux de transactions (WAL) de PostgreSQL, écrit en Python[64].
DBeaver est un outil d’administration GUI gratuit et open source pour PostgreSQL. Il propose des diagrammes entité-relation visuels et des fonctionnalités comme IntelliSense. Une version commerciale (PRO) est également disponible.
Plusieurs entreprises proposent des outils propriétaires pour PostgreSQL, souvent construits autour d’un noyau universel adaptable à différentes bases de données. Ces outils partagent les fonctionnalités d’administration des logiciels open source, mais offrent des améliorations en matière de modélisation des données, importation, exportation et reporting.
Des organisations et produits notables qui utilisent PostgreSQL comme base de données principale incluent :
Pour chacun des langages usuels, ou avancés, PostgreSQL dispose d'une interface le plus souvent proposée sous la forme d'un pilote du moteur de base de données. C'est ainsi le cas notamment pour PHP, Ruby, Java, Perl, Python, ou C et C++, mais aussi pour de très nombreux autres langages.