2014-09-21 4 views
1

Я хотел начать использовать базы данных в python. Я выбрал postgresql для «языка» базы данных. Я уже создал несколько баз данных, но теперь хочу просто проверить, существует ли база данных с python. Для этого я уже читал этот ответ: Checking if a postgresql table exists under python (and probably Psycopg2) и пытались использовать их решение:Ошибка при тестировании базы данных postgresql с помощью python

import sys 
import psycopg2 

con = None 

try: 
    con = psycopg2.connect(database="testdb", user="test", password="abcd") 
    cur = con.cursor() 
    cur.execute("SELECT exists(SELECT * from information_schema.testdb)") 
    ver = cur.fetchone()[0] 
    print ver 
except psycopg2.DatabaseError, e: 
    print "Error %s" %e 
    sys.exit(1) 
finally: 
    if con: 
     con.close() 

Но, к сожалению, я только получить выход

Error relation "information_schema.testdb" does not exist 
LINE 1: SELECT exists(SELECT * from information_schema.testdb) 

я делаю что-то неправильно, или я что-то пропустил?

+2

ответ, на который вы ссылаетесь, использует 'information_schema.tables'. Вы не можете просто заменить «tables» своим именем базы данных. – Laurence

+0

Но если я использую 'information_schema.tables', я получаю' false', что неправильно ... –

+0

Если вы еще не создали таблицы, в 'information_schema.tables' не будет строк. Я подозреваю, что сам факт существования вызова 'connect' является доказательством существования базы данных. Если это будет очень легко проверить. – Laurence

ответ

1

Если вы пытаетесь увидеть, если база данных существует:

curs.execute("SELECT exists(SELECT 1 from pg_catalog.pg_database where datname = %s)", ('mydb',)) 

Это звучит, как вы можете быть сбиты с толку разница между базой данных и таблицы.

+0

Да, это была моя проблема (после того, как я все еще новичок в SQL, я переключил базу данных и таблицу). Ваше решение решило это. –

+1

@arc_lupus Если это помогает: экземпляр PostgreSQL содержит базы данных, содержащие схему, которые содержат таблицы, представления и другие * отношения *, а также различные объекты, не связанные с отношением, такие как типы. См. Http://stackoverflow.com/q/12232640/398670 –

2

Ваш вопрос меня немного смущает, потому что вы говорите, что хотите посмотреть, существует ли база данных, но вы смотрите в представлении information_schema.tables. В этом представлении будет указано, существует ли таблица в текущей открытой базе данных. Если вы хотите, чтобы проверить, существует ли база данных, если у вас есть доступ к базе данных «Postgres», вы можете:

import sys 
import psycopg2, psycopg2.extras 
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) 
dbname = 'db_to_check_for_existance' 
con = None 

try: 
    con = psycopg2.connect(database="postgres", user="postgres") 
    cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor) 
    cur.execute("select * from pg_database where datname = %(dname)s", {'dname': dbname }) 
    answer = cur.fetchall() 
    if len(answer) > 0: 
     print "Database {} exists".format(dbname) 
    else: 
     print "Database {} does NOT exist".format(dbname) 
except Exception, e: 
    print "Error %s" %e 
    sys.exit(1) 
finally: 
    if con: 
     con.close() 

Что здесь происходит, вы смотрите в таблицах базы данных, называемых pg_database. В столбце «имя_данных» содержится каждое из имен базы данных. Ваш код будет поставлять db_to_check_for_existance в качестве имени базы данных, которую вы хотите проверить на наличие. Например, вы можете заменить это значение на «postgres», и вы получите ответ «существует». Если вы замените значение на aardvark, вы, вероятно, получите отчет NOT NOT.

+0

Хорошее объяснение. –

Смежные вопросы