另一个异步SQL库。
项目描述
AsyncSQL
AsyncSQL旨在提供使用aiohttp执行PostgreSQL请求的简单高效方式。
安装
作为Python库,AsyncSQL可以按以下方式安装:
(venv)$ pip install asyncsql
设置
要连接到PostgreSQL,通常应使用环境变量。
例如,在开发时可以使用以下值:
$ export PGHOST=172.19.0.2 # depends on which IP postgres container is using
$ export PGDATABASE=asyncsql
$ export PGUSER=postgres
$ export PGPASSWORD=xxx
默认情况下,数据列表是分页的。页面大小可以指定如下:
$ export ASYNCSQL_PER_PAGE=25 # default: 50
包含.sql文件的文件夹可以指定如下:
$ export ASYNCSQL_SQL_DIR=./tests/data # default: ./sql_files
迁移
为了简化数据库设置,AsyncSQL提供了一个简单的migrate
命令。
例如,我们可以按以下方式加载测试数据:
(venv)$ python -m asyncsql.migrate -d ./tests/data jobs # file-2 file-3
jobs... ok
这里没有魔法子弹,文件顺序很重要,以及幂等性。
用法
让我们在我们的jobs
测试表上执行一些查询。
首先,我们需要在我们的Python代码中定义一个Model
对象来与之一起工作
from datetime import datetime
from typing import Optional
from uuid import UUID
from asyncsql.models import Model
class Job(Model):
id: Optional[UUID] = None
enabled: bool = False
func: str
name: str
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
然后我们需要一个Queries
实例
from asyncsql.queries import Queries
jobs_queries = Queries(
"jobs",
model_cls=Job,
order_fields=("name",)
)
让我们按以下方式连接
import asyncio
from asyncsql.backends import sql_backend
conn = await sql_backend.conn
由于数据库为空,简单的
await jobs_queries.select(conn)
# ([], False)
让我们插入一些数据
for x in range(10):
await jobs_queries.insert(conn, Job(func="ping", name=f"ping-{x}"))
现在我们应该有如下数据
[j.name for j in (await jobs_queries.select(conn))[0]]
# ['ping-0',
# 'ping-1',
# 'ping-2',
# 'ping-3',
# 'ping-4',
# 'ping-5',
# 'ping-6',
# 'ping-7',
# 'ping-8',
# 'ping-9']
我们可以通过更改per_page
值来限制结果
jobs_queries.per_page = 3
jobs, has_next = await jobs_queries.select(conn)
[j.name for j in jobs], has_next
# (['ping-0', 'ping-1', 'ping-2'], True)
就像在API中做的那样,我们可以通过以下方式获取下一页,使用一个Cursor
对象
from asyncsql.cursor import Cursor
Cursor(fields=("name",), obj=jobs[-1])
# gASV6wAAAAAAAAAojANhc2OUfZQojAJpZJSMJDRlNTM1YTQ4LWJmMjgtMTFlYi05ZDc3LTAyNDJhYzEzMDAwMpSMB2VuYWJsZWSUiYwEZnVuY5SMBHBpbmeUjARuYW1llIwGcGluZy0ylIwKY3JlYXRlZF9hdJSMCGRhdGV0aW1llIwIZGF0ZXRpbWWUk5RDCgflBRsUDycNJDGUaAqMCHRpbWV6b25llJOUaAqMCXRpbWVkZWx0YZSTlEsASwBLAIeUUpSFlFKUhpRSlIwKdXBkYXRlZF9hdJRoDEMKB+UFGxQPJw0kMZRoFYaUUpR1KX2UdJQu
where, values, _ = jobs_queries.get_where_from_cursor(_)
where, values
# ('name >= $1 AND id != $2', ['ping-2', '4e535a48-bf28-11eb-9d77-0242ac130002'])
jobs, has_next = await jobs_queries.select(conn, values=values, where=where)
[j.name for j in jobs], has_next
# (['ping-3', 'ping-4', 'ping-5'], True)
Job
对象也可以用于更新
job = (await jobs_queries.select(conn, values=("ping-9",), where="name = $1"))[0][0]
job.id, job.name
# ('4e5692d0-bf28-11eb-9d77-0242ac130002', 'ping-9')
job.name = "ping-x"
new_job = await jobs_queries.update(conn, job)
new_job.name
# ping-x
让我们清理这个演示
jobs_queries.per_page = 10
for j in (await jobs_queries.select(conn))[0]:
await jobs_queries.delete_by_id(conn, j.id)
想法
- 创建更小的光标:序列化整个对象可能是一种开销
- 使用模板.sql文件而不是在
Queries
中硬编码的sql
字符串
贡献
欢迎贡献。虽然可能很简单,但它是经过测试的,因为它是从测试开始的。
许可证
MIT
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。
源代码发行版
asyncsql-0.1.4.tar.gz (11.1 kB 查看散列值)
构建发行版
asyncsql-0.1.4-py2.py3-none-any.whl (10.6 kB 查看散列值)
关闭
asyncsql-0.1.4.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | d666e8f68762131a83be2e168a7548d2a89964e2f7a3b9cfe92a6591e9dc4095 |
|
MD5 | 5777b1491fd1499049abb3a612b33c8c |
|
BLAKE2b-256 | 28ac0de2da7d1448477e3f7af6affa0d3a5ff475cda67e8d6400e7703ba650dd |
关闭
asyncsql-0.1.4-py2.py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 111a42631fcf46069823d9b51b8a74f2a142870aba26f37836db114f90f72e84 |
|
MD5 | 3171d7bdd051602b4a882417a5c895bb |
|
BLAKE2b-256 | 522f33ee678117cb31cd4bb5a628c6f8389caea1db30ce824ec41437c6a1c696 |