Может быть здесь есть знатоки Gino? Ответа от разработчиков по почте пока не получил
Gino - это orm, использующая драйвер asyncpg, основанная на sqlalchemy. И разработчики придерживались идеи не менять принципов sqlalchemy
Скопирую мой вопрос:
1) В чём отличия между
import sqlalchemy
async def main():
engine = await sqlalchemy.create_engine('postgresql://... , strategy='gino')
и
import gino
async def main():
engine = await gino.create_engine('postgresql://...)
Какой способ всё же предпочтительнее? Или они абсолютно идентичны?
Могу ли я во втором способе как-то явно указывать, что я хочу использовать psycopg2? Для сравнения производительности
2) Для чего может понадобиться await engine.pop_bind().close() в реализации логики? Есть какие-то "правила гигиены", гласящие, что GinoEngine нужно останавливать каждый раз при остановке бекенд сервера вручную?
3) При каких сценариях стоит явно указывать экземпляр GinoConnection? То есть использовать async with engine.acquire() as conn: ?
Например простое
async with db.with_bind('postgresql://localhost/mydb') as engine:
await db.gino.create_all()
await User.create(name='jack', fullname='Jack Jones')
Тоже вполне хорошо работает, и, на сколько я понимаю, под капотом эти GinoConnection так или иначе создаются, просто в коде выше нет тонкого контроля над ними.
Для чего к примеру может понадобиться создавать такие стеки из connection'ов?
async with engine.acquire() as conn1
async with engine.acquire() as conn2
async with engine.acquire() as conn3 ...
И чем принципиально этот стек будет отличаться от такой реализации?
async with engine.acquire() as conn1:
await inner(conn1)
async def inner()
async with engine.acquire() as conn2
4) Хотелось бы уточнить - следующий код реализует стек из 3х GinoConnection'ов, где самый верхний будет являться raw connection'ом, второй reusable connection'ом, а 3й - reusing connection'ом ?
async with engine.acquire() as conn
await User.create(name='jack')
await User.create(name='jane')
await User.create(name='james')
5) При каких сценяриях может понадобиться использовать lazy=True? или reusable = False? в параметрах acquire() ?
Меня пока устривает принцип работы с параметрами по умолчанию - timeout=None, reuse=False, lazy=False, reusable = true. Но хочется понять, в каких случаях стоило бы использовать lazy=True? или reusable = False? и почему?
Да, и ещё - правильно ли я понимаю, что в
async with engine.acquire() as conn1
async with engine.acquire() as conn2
async with engine.acquire() as conn3 ...
conn1, conn2, conn3 образуют стек, где conn1 - это raw connection, conn2 - reusable connection, а conn3 - reusing connection? или всё в обратном порядке? Или тут вообще никакого стека connection'ов нет?