Est-ce que quelqu'un sait comment trouver le OID d'une table dans Postgres 9.1? J'écris un script de mise à jour qui doit vérifier l'existence d'une colonne dans une table avant d'essayer de créer la colonne. Cela empêche l'exécution du script après la première erreur.
La table de catalogue postgres pg_class
est ce que vous devriez regarder. Il devrait y avoir une ligne par table, avec le nom de la table dans la colonne relname
et l'oid dans la colonne masquée oid
.
Les tables du catalogue se trouvent dans la base de données postgres
. Veillez donc à vous connecter à cette base plutôt qu'à votre base de données d'application.
Vous pouvez également être intéressé par la table de catalogue pg_attribute
, qui comprend une ligne par colonne de table.
Voir: http://www.postgresql.org/docs/current/static/catalog-pg-class.html et http://www.postgresql.org/docs/current/static/catalog- pg-attribut.html
Pour obtenir un OID de table, convertissez le type d'identificateur d'objet regclass
(lorsque vous êtes connecté au même DB):
SELECT 'mytbl'::regclass::oid;
Ceci trouve la première table (ou vue, etc.) avec le nom donné le long du search_path
ou déclenche une exception si elle n'est pas trouvée.
Schéma-qualifiez le nom de la table pour supprimer la dépendance sur le chemin de recherche:
SELECT 'myschema.mytbl'::regclass::oid;
Dans Postgres 9.4 ou version ultérieure, vous pouvez également utiliser to_regclass('myschema.mytbl')
, qui ne déclenche pas d'exception si la table n'est pas trouvée:
Ensuite, vous devez uniquement interroger la table du catalogue pg_attribute
pour connaître l'existence de la colonne:
SELECT TRUE AS col_exists
FROM pg_attribute
WHERE attrelid = 'myschema.mytbl'::regclass
AND attname = 'mycol'
AND NOT attisdropped -- no dropped (dead) columns
-- AND attnum > 0 -- no system columns (you may or may not want this)
Pour compléter les possibilités, j'aimerais ajouter qu'il existe une syntaxe pour supprimer des colonnes afin de ne pas avoir d'erreur:
ALTER TABLE mytbl DROP COLUMN SI EXISTS mycol
Voir http://www.postgresql.org/docs/9.0/static/sql-altertable.html
Ensuite, vous pouvez ajouter votre colonne en toute sécurité.
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';