标签: aiopg

带有 asyncio 的 Django ORM

我正在寻找可以允许将 Django ORM 与 asyncio(使用 PostgreSQL)一起使用的东西。截至目前,我发现只有aiopg在ASYNCIO的生态系统,它允许运行原始SQL或仅使用SQLAlchemy。

然后我在django 频道文档中找到了一些东西。这是:

https://github.com/django/channels/blob/master/channels/db.py

我正在寻找的缺失部分?

谢谢

django python-3.x python-asyncio django-channels aiopg

7
推荐指数
0
解决办法
2685
查看次数

aiopg + sqlalchemy:如何在没有原始sql的情况下“删除表(如果存在)”?

我正在看sqlalchemy的aiopg用法示例,这些行使我感到恐惧:

async def create_table(conn):
    await conn.execute('DROP TABLE IF EXISTS tbl')
    await conn.execute(CreateTable(tbl))
Run Code Online (Sandbox Code Playgroud)

使用sqlalchemy时,我不想执行原始sql查询。但是我找不到其他方法来实现相同的逻辑。我的尝试是:

1)

await conn.execute(tbl.drop(checkfirst=True))
Run Code Online (Sandbox Code Playgroud)

这引起了:

sqlalchemy.exc.UnboundExecutionError:表对象“ tbl”未绑定到引擎或连接。没有要执行的数据库,执行将无法进行。

我也找不到将表绑定到引擎的方法,因为aiopg不支持元数据。

2)

await conn.execute(DropTable(tbl))
Run Code Online (Sandbox Code Playgroud)

这引起了:

psycopg2.errors.UndefinedTable:表“ tbl”不存在

似乎DropTable构造不IF EXISTS以任何方式支持部分。

因此,问题是,await conn.execute('DROP TABLE IF EXISTS tbl')使用aiopg + sqlalchemy时,有没有办法将语句重写为没有原始sql的内容?

python postgresql sqlalchemy drop-table aiopg

7
推荐指数
1
解决办法
150
查看次数

使用 pytest、tornado 和 aiopg 进行单元测试失败,任何查询都失败

我有一个在 Python 3.7 + Tornado 5 上运行的 REST API,使用 postgresql 作为数据库,使用带有 SQLAlchemy 核心的 aiopg(通过 aiopg.sa 绑定)。对于单元测试,我使用 py.test 和 pytest-tornado。

只要不涉及对数据库的查询,所有测试都会正常进行,我会得到这个:

运行时错误:任务 cb=[IOLoop.add_future..() at venv/lib/python3.7/site-packages/tornado/ioloop.py:719]> 将 Future 附加到不同的循环

相同的代码在测试中运行良好,到目前为止我能够处理 100 个请求。

这是@auth 装饰器的一部分,它将检查 JWT 令牌的 Authorization 标头,对其进行解码并获取用户数据并将其附加到请求中;这是查询的部分:

                partner_id = payload['partner_id']
                provided_scopes = payload.get("scope", [])
                for scope in scopes:
                    if scope not in provided_scopes:
                        logger.error(
                            'Authentication failed, scopes are not compliant - '
                            'required: {} - '
                            'provided: {}'.format(scopes, provided_scopes)
                        )
                        raise ForbiddenException(
                            "insufficient permissions or wrong user."
                        )
                db = self.settings['db'] …
Run Code Online (Sandbox Code Playgroud)

asynchronous tornado pytest python-3.x aiopg

4
推荐指数
1
解决办法
1313
查看次数

如何提高许多附加到列表的性能?

如何提高以下代码的性能?

BANNED_DOORBOTS = {...}

async def execute_query(self, query):
    async with self.pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute(query)
            records = []
            async for row in cur:
                if row[0] not in BANNED_DOORBOTS:
                    records.append({
                        'key1': row[0],
                        'key2': row[1]
                    })

    return records
Run Code Online (Sandbox Code Playgroud)

我不想每次检查if row[0] not in BANNED_DOORBOTS.怎么避免这个?

通常,我有超过一百(最多20 000)个元素records.也许我可以预先分配一些空间以避免重新分配?

python algorithm postgresql async-await aiopg

2
推荐指数
1
解决办法
113
查看次数