В 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')
)