首页 > 解决方案 > asyncpg - 如果不存在,则连接到服务器并创建数据库

问题描述

有没有办法像在 Hibernate 中一样使用 asyncpg 在 PostgreSQL 服务器中创建数据库,使用:

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

uri 中的标志。有没有办法连接到服务器而不连接到数据库并执行 sql 语句?

标签: pythonsqldatabasepostgresqlasyncpg

解决方案


在 asyncpg 中没有这方面的捷径,但它很容易在您的代码中实现。每个 PostgreSQL 集群都有一个数据库,如果您连接的原始数据库不存在 template1,可以使用该数据库发出语句。通常需要特殊权限,因此在连接时需要使用超级用户帐户(通常)。CREATE DATABASECREATE DATABASEtemplate1postgres

例子:

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

推荐阅读