psycopg2 почему схема не создана? - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь создать схему в базе данных 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

РЕДАКТИРОВАТЬ 2 Из чистого любопытства я попытался выполнить это очень SQL утверждение в pgadmin:

CREATE SCHEMA IF NOT EXISTS schema2

, и оно работает просто отлично, что показывает, что мой SQL не ошибается, поэтому вернемся к исходной точке.

РЕДАКТИРОВАТЬ 3 - Решение

Итак, я нашел решение, спасибо вам, @jjanes, за то, что вы указали мне правильное направление. Эта функция не подключается к определенной c базе данных, но к серверу в целом, так как я использую ее для создания новых баз данных, поэтому строка подключения выглядит примерно так:

user=postgres password=12345 host=localhost port=5432

, что позволяет мне выполнять операции на уровне сервера, такие как создание и удаление базы данных. Но схемы являются операцией уровня базы данных. Перемещение точно такой же логики c в ту часть кода, которая связана с вновь созданной базой данных, работает как чудо.

1 Ответ

0 голосов
/ 18 марта 2020

Вы создаете схему в исходной базе данных, указанной строкой соединения. После создания новой базы данных вам необходимо подключиться к ней, чтобы работать в ней. В противном случае вы просто работаете в старой базе данных.

...