Comment puis-je déterminer si une table existe à l'aide de la bibliothèque Psycopg2 Python? Je veux un booléen vrai ou faux.Vérification de l'existence d'une table postgresql sous python (et probablement Psycopg2)
Répondre
Que diriez-vous:
>>> import psycopg2
>>> conn = psycopg2.connect("dbname='mydb' user='username' host='localhost' password='foobar'")
>>> cur = conn.cursor()
>>> cur.execute("select * from information_schema.tables where table_name=%s", ('mytable',))
>>> bool(cur.rowcount)
True
Une alternative avec exists est mieux en ce qu'elle ne nécessite pas que toutes les lignes soient récupérées, mais simplement qu'au moins une telle ligne existe:
>>> cur.execute("select exists(select * from information_schema.tables where table_name=%s)", ('mytable',))
>>> cur.fetchone()[0]
True
select exists(select relname from pg_class
where relname = 'mytablename' and relkind='r');
pas des œuvres pour relname avec le schéma, comme 'myschema.tabname' –
Je ne sais pas le psycopg2 lib spécifiquement, mais la requête suivante peut être utilisé pour vérifier l'existence d'une table:
SELECT EXISTS(SELECT 1 FROM information_schema.tables
WHERE table_catalog='DB_NAME' AND
table_schema='public' AND
table_name='TABLE_NAME');
L'avantage d'utiliser information_schema sur la sélection directement à partir du pg_ * tables est un certain degré de portabilité de la requête.
Pour l'utilisation de table_catalog par défaut ?? –
La première réponse n'a pas fonctionné pour moi. J'ai trouvé le succès vérification de la relation à pg_class:
def table_exists(con, table_str):
exists = False
try:
cur = con.cursor()
cur.execute("select exists(select relname from pg_class where relname='" + table_str + "')")
exists = cur.fetchone()[0]
print exists
cur.close()
except psycopg2.Error as e:
print e
return exists
#!/usr/bin/python
# -*- coding: utf-8 -*-
import psycopg2
import sys
con = None
try:
con = psycopg2.connect(database='testdb', user='janbodnar')
cur = con.cursor()
cur.execute('SELECT 1 from mytable')
ver = cur.fetchone()
print ver //здесь наш код при успехе
except psycopg2.DatabaseError, e:
print 'Error %s' % e
sys.exit(1)
finally:
if con:
con.close()
La solution suivante est la manipulation schema
aussi:
import psycopg2
with psycopg2.connect("dbname='dbname' user='user' host='host' port='port' password='password'") as conn:
cur = conn.cursor()
query = "select to_regclass(%s)"
cur.execute(query, ['{}.{}'.format('schema', 'table')])
exists = bool(cur.fetchone()[0])
Fermer mais mieux utiliser 'exists()'. :) – jathanism
J'ai ajouté cela, mais pourquoi est-ce "mieux"? –
@Peter C'est mieux car il suffit de trouver la première ligne correspondant à la condition 'where' tandis que' rowcount' devra récupérer toutes les lignes. –