Подтвердить что ты не робот

Проверка наличия таблицы postgresql в python (и, вероятно, Psycopg2)

Как определить, существует ли таблица с помощью библиотеки Psycopg2 Python? Я хочу true или false boolean.

4b9b3361

Ответ 1

Как насчет:

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

Альтернатива, использующая EXISTS, лучше в том, что она не требует, чтобы все строки были извлечены, а просто, что существует хотя бы одна такая строка:

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

Ответ 2

Я не знаю psycopg2 lib специально, но следующий запрос может быть использован для проверки существования таблицы:

SELECT EXISTS(SELECT 1 FROM information_schema.tables 
              WHERE table_catalog='DB_NAME' AND 
                    table_schema='public' AND 
                    table_name='TABLE_NAME');

Преимущество использования information_schema при прямом выборе из таблиц pg_ * - это некоторая степень переносимости запроса.

Ответ 3

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

Ответ 4

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

Ответ 5

Первый ответ не работал для меня. Я нашел успешную проверку для отношения в 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

Ответ 6

Следующее решение также обрабатывает 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])

Ответ 7

Расширяя вышеупомянутое использование EXISTS, мне нужно было кое-что для тестирования существования таблицы в целом. Я обнаружил, что тестирование результатов с использованием fetch дало результат "Нет" в пустой существующей таблице - не идеально.

Вот что я придумала:

import psycopg2

def exist_test(tabletotest):

    schema=tabletotest.split('.')[0]
    table=tabletotest.split('.')[1]
    existtest="SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = '"+schema+"' AND table_name = '"+table+"' );"

    print('existtest',existtest)

    cur.execute(existtest) # assumes youve already got your connection and cursor established

    # print('exists',cur.fetchall()[0])
    return ur.fetchall()[0] # returns true/false depending on whether table exists


exist_test('someschema.sometable')