доступ к postgresql серверу через python3 завершается неудачно, если (не требуется) БД не существует - PullRequest
0 голосов
/ 09 апреля 2020

psql пользователь был создан как часть следующего:

postgres=# create database testdb;
postgres=# create user testuser with encrypted password 'testpass';
postgres=# grant all privileges on database testdb to testuser;
postgres=# alter user testuser createdb;

Приведенный ниже сценарий python3 работает, если база данных "testdb" существует.
Однако сценарий завершается ошибкой:

 (NameError: name 'con' is not defined)

, если «testdb» не существует.

Я не понимаю требования, так как еще не попросил подключиться к БД. любая помощь, которую вы можете предложить, чтобы помочь мне понять, ценится заранее. tnx.

# import modules
import psycopg2

# connect to db server
try:
    con = psycopg2.connect(
        host = "127.0.0.1",
        port = "5432",
        user = "testuser",
        password = "testpass")

except:
    print("Unable to connect to db server")

# create cursor
cur = con.cursor()

# display list of db on server
cur.execute("""SELECT datname from pg_database""")
rows = cur.fetchall()

# print list of db on server
print ("\nConnection successful.  Listing databases on server:\n")
for row in rows:
    print ("   ", row[0])

# close the cursor
print ("\nClosing server connection.\n")
cur.close()

# close the connection
con.close()

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

В libpq PostgreSQL (на котором основан psycopg2), если вы укажете имя пользователя, но не имя dbname, он автоматически попытается подключиться к базе данных, которая принимает те же слова, что и указанный вами пользователь.

Вы указываете пользователя 'testuser', но не указываете базу данных, поэтому он пытается подключиться к базе данных с именем 'testuser'. Если этого не существует, конечно, соединение не будет установлено.

Вы сказали, что база данных, которая должна существовать, чтобы это работало, - "testdb", но я вижу, что однажды вы указали имя пользователя как "testdb", но затем отредактировал ваш вопрос и изменил его на "testuser". Так что я думаю, что пример, который вы показываете, не тот код, который вы выполняете на самом деле, так как вы выполняли его частичное редактирование после факта.

В своем коде соединения вы должны указать имя dbname, которое вы уже знаете существует.

0 голосов
/ 09 апреля 2020

Вы действительно должны посмотреть на соединение gevent, которое я написал здесь. Это автоматизирует все это для вас, и вам не нужно изобретать велосипед.

Python Postgres psycopg2 Резьбовое соединениеПул исчерпан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...