我正在寻找可以允许将 Django ORM 与 asyncio(使用 PostgreSQL)一起使用的东西。截至目前,我发现只有aiopg在ASYNCIO的生态系统,它允许运行原始SQL或仅使用SQLAlchemy。
然后我在django 频道文档中找到了一些东西。这是:
https://github.com/django/channels/blob/master/channels/db.py
我正在寻找的缺失部分?
谢谢
我正在看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 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) 如何提高以下代码的性能?
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.也许我可以预先分配一些空间以避免重新分配?
aiopg ×4
postgresql ×2
python ×2
python-3.x ×2
algorithm ×1
async-await ×1
asynchronous ×1
django ×1
drop-table ×1
pytest ×1
sqlalchemy ×1
tornado ×1