asyncpg - подключиться к серверу и создать базу данных, если не существует - PullRequest
0 голосов
/ 22 мая 2019

Есть ли способ создать базу данных на сервере PostgreSQL, используя asyncpg, как вы можете в Hibernate, используя:

jdbc:mysql://localhost:3306/db_name?createDatabaseIfNotExist=true

флаги в ури. Есть ли способ подключения к серверу без подключения к БД и выполнения операторов SQL?

1 Ответ

0 голосов
/ 23 мая 2019

В asyncpg нет ярлыка для этого, но его легко реализовать в вашем коде.Каждый кластер PostgreSQL имеет базу данных template1, которую можно использовать для выдачи оператора CREATE DATABASE, если исходная база данных, к которой вы подключаетесь, не существует.CREATE DATABASE обычно требует специальных привилегий, поэтому вам необходимо использовать учетную запись суперпользователя при подключении к template1 (обычно postgres).

Пример:

import asyncio
import asyncpg

async def connect_create_if_not_exists(user, database):
    try:
        conn = await asyncpg.connect(user=user, database=database)
    except asyncpg.InvalidCatalogNameError:
        # Database does not exist, create it.
        sys_conn = await asyncpg.connect(
            database='template1',
            user='postgres'
        )
        await sys_conn.execute(
            f'CREATE DATABASE "{database}" OWNER "{user}"'
        )
        await sys_conn.close()

        # Connect to the newly created database.
        conn = await asyncpg.connect(user=user, database=database)

    return conn


asyncio.get_event_loop().run_until_complete(
    connect_create_if_not_exists(user='elvis', database='new-database')
)
...