web-dev-qa-db-fra.com

Vérifier si une table postgresql existe sous Python (et probablement Psycopg2)

Comment puis-je déterminer si une table existe à l'aide de la bibliothèque Psycopg2 Python? Je veux un vrai ou un faux booléen.

39
Hellnar

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 utilisant EXISTS est préférable car elle n'exige pas que toutes les lignes soient récupérées, mais simplement qu'au moins une de ces lignes existe:

>>> cur.execute("select exists(select * from information_schema.tables where table_name=%s)", ('mytable',))
>>> cur.fetchone()[0]
True
64
Peter Hansen

Je ne connais pas spécifiquement la bibliothèque psycopg2, mais la requête suivante peut être utilisée 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 par rapport à la sélection directe dans les tables pg_ * est un certain degré de portabilité de la requête.

19
overthink
select exists(select relname from pg_class 
where relname = 'mytablename' and relkind='r');
3
ChristopheD
#!/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()
2
des1roer

La première réponse n'a pas fonctionné pour moi. J'ai trouvé succès en vérifiant la relation dans 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
rirwin

La solution suivante gère également la schema:

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])
0
Dimo Boyadzhiev