有没有办法像在 Hibernate 中一样使用 asyncpg 在 PostgreSQL 服务器中创建数据库,使用:
jdbc:mysql://localhost:3306/db_name?createDatabaseIfNotExist=true
uri 中的标志。有没有办法连接到服务器而不连接到数据库并执行 sql 语句?
有没有办法像在 Hibernate 中一样使用 asyncpg 在 PostgreSQL 服务器中创建数据库,使用:
jdbc:mysql://localhost:3306/db_name?createDatabaseIfNotExist=true
uri 中的标志。有没有办法连接到服务器而不连接到数据库并执行 sql 语句?
在 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')
)