Я пытаюсь создать схему в базе данных postgres с помощью psycopg2.
По какой-то причине схема не создается, и в дальнейшем код завершается сбоем, поскольку он пытается обратиться к отсутствующей схеме. Соединение установлено в режим автоматической фиксации, который определенно работает, потому что я могу создать базу данных с этим указанным c подключением.
В целях отладки я завернул каждый шаг в свой собственный оператор try / исключением.
Код приведен ниже, так как он здесь, он не вызывает никаких исключений, только последующие сбои, потому что схема отсутствует.
def createDB(dbName, connString):
conn = psycopg2.connect(connString)
conn.set_session(autocommit =True) # autocommit must be True sein, else CREATE DATABASE will fail https://www.psycopg.org/docs/usage.html#transactions-control
cursor = conn.cursor()
createDB = sql.SQL('CREATE DATABASE {};').format(
sql.Identifier(dbName)
)
createSchema = sql.SQL('CREATE SCHEMA IF NOT EXISTS schema2;')
searchpath = sql.SQL('ALTER DATABASE {} SET search_path TO public, schema2;').format(
sql.Identifier(dbName)
)
dropDB = sql.SQL('DROP DATABASE IF EXISTS {};').format(
sql.Identifier(dbName)
)
try:
cursor.execute(dropDB)
except Exception as e:
print('drop DB failed')
logging.error(e)
conn.close()
exit()
try:
cursor.execute(createDB)
except Exception as e:
print('create DB failed')
logging.error(e)
conn.close()
exit()
try:
cursor.execute(createSchema)
print('schema created')
except Exception as e:
print('create schema failed')
logging.error(e)
conn.close()
exit()
try:
cursor.execute(searchpath)
except Exception as e:
print('set searchpath failed')
logging.error(e)
conn.close()
exit()
conn.close()
Добавление явного коммита не помогает. или. Чего мне не хватает?
РЕДАКТИРОВАТЬ Я добавил небольшой скриншот с журналами консоли. Как видите, приведенный ниже код выполняется:
![Console screenshot](https://i.stack.imgur.com/aVazZ.png)
РЕДАКТИРОВАТЬ 2 Из чистого любопытства я попытался выполнить это очень SQL утверждение в pgadmin:
CREATE SCHEMA IF NOT EXISTS schema2
, и оно работает просто отлично, что показывает, что мой SQL не ошибается, поэтому вернемся к исходной точке.
РЕДАКТИРОВАТЬ 3 - Решение
Итак, я нашел решение, спасибо вам, @jjanes, за то, что вы указали мне правильное направление. Эта функция не подключается к определенной c базе данных, но к серверу в целом, так как я использую ее для создания новых баз данных, поэтому строка подключения выглядит примерно так:
user=postgres password=12345 host=localhost port=5432
, что позволяет мне выполнять операции на уровне сервера, такие как создание и удаление базы данных. Но схемы являются операцией уровня базы данных. Перемещение точно такой же логики c в ту часть кода, которая связана с вновь созданной базой данных, работает как чудо.