Я использую Postgres, Python3.7 с asyncio
+ asyncpg
+ gino
(ORM-ish) + aiohttp
(маршрутизация, веб-ответы).
Я создал небольшойpostgres таблицу users
в моей базе данных 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.