我正在使用带有asyncio
++ (ORM-ish)+ asyncpg
(路由、网络响应)的 Postgres、Python3.7。gino
aiohttp
users
我在我的数据库中创建了一个小型 postgres 表testdb
并插入了一行:
testdb=# select * from users;
id | nickname
----+----------
1 | fantix
我正在尝试设置我的数据库,以便在请求进入时可以在路由中使用 ORM。
import time
import asyncio
import gino
DATABASE_URL = os.environ.get('DATABASE_URL')
db = gino.Gino()
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer(), primary_key=True)
nickname = db.Column(db.Unicode(), default='noname')
kwargs = dict(
min_size=10,
max_size=100,
max_queries=1000,
max_inactive_connection_lifetime=60 * 5,
echo=True
)
async def test_engine_implicit():
await db.set_bind(DATABASE_URL, **kwargs)
return await User.query.gino.all() # this works
async def test_engine_explicit():
engine = await gino.create_engine(DATABASE_URL, **kwargs)
db.bind = engine
async with engine.acquire() as conn:
return await conn.all(User.select()) # this doesn't work!
users = asyncio.get_event_loop().run_until_complete(test_engine_implicit())
print(f'implicit query: {users}')
users = asyncio.get_event_loop().run_until_complete(test_engine_explicit())
print(f'explicit query: {users}')
输出是:
web_1 | INFO gino.engine._SAEngine SELECT users.id, users.nickname FROM users
web_1 | INFO gino.engine._SAEngine ()
web_1 | implicit query: [<db.User object at 0x7fc57be42410>]
web_1 | INFO gino.engine._SAEngine SELECT
web_1 | INFO gino.engine._SAEngine ()
web_1 | explicit query: [()]
这很奇怪。“显式”代码本质上是SELECT
针对数据库运行的,这是无用的。
我在文档中找不到一种方法来 1) 使用 ORM,以及 2) 明确地检查池中的连接。
我的问题:
- 是否
await User.query.gino.all()
检查池中的连接?它是如何发布的? - 我将如何在事务中包装查询?我很不安,因为我无法明确控制何时/何地从池中获取连接,以及如何释放它。
我基本上喜欢test_engine_explicit()
与 Gino 一起工作的风格的明确性,但也许我只是不理解 Gino ORM 的工作原理。