python - asyncpg - 如果不存在,则连接到服务器并创建数据库
问题描述
有没有办法像在 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')
)
推荐阅读
- c# - MsBuild C# csproj:将开发环境平台名称(Win、Mac 等)放入属性中
- bash - 尽管 echo 显示变量相等,但平等比较在 bash 脚本中不起作用
- vb.net - 将文件名返回到数据网格 - 子目录
- ruby-on-rails - Rails/Heroku/Cloudflare:域更改后无法验证 CSRF 令牌的真实性
- javascript - Unicode 正则表达式 \p{L} 在 NodeJS 中不起作用
- python - Python / 最小正整数
- facebook-messenger - 在 Messenger 平台的 Facebook 按钮中添加额外的有效负载/ID
- node.js - 下划线作为前缀的属性的 eslint 问题
- python - 从命令行调用脚本时导入模块不起作用
- python - 插入双向链表的任意位置(不是开头或结尾)的问题