2009-12-09 7 views

Répondre

56

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 
+2

Fermer mais mieux utiliser 'exists()'. :) – jathanism

+2

J'ai ajouté cela, mais pourquoi est-ce "mieux"? –

+2

@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. –

3
select exists(select relname from pg_class 
where relname = 'mytablename' and relkind='r'); 
+0

pas des œuvres pour relname avec le schéma, comme 'myschema.tabname' –

19

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.

+0

Pour l'utilisation de table_catalog par défaut ?? –

1

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 
1
#!/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() 
0

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])