There's every reason just to stick with the default of QueuePool
:
QueuePool only opens as many connections as it's asked to at at time. If your app uses only one connection at a time, that's the only connection your app will open.
SQLAlchemy itself never opens additional connections beyond what you tell it to (anything that requires database access is basically going to use a single connection to access the DB. like create_all(), or Session.query().whatever. It only uses one connection at a time.).
if your app does happen to have some kind of thing that incurs more than one connection at a time, such as, using two Session objects at once, or perhaps calling engine.execute() when you are still fetching the results from another engine.execute(), QueuePool will set up that second connection without any issue. Whereas StaticPool will use the same connection and then you'll get issues.
If you really want to make sure your app is using one and only one connection per process, you can look into AssertionPool - this is more of a debugging/test pool though, not necessarily one that we've used at scale. Or set up QueuePool with pool_size=1 and max_overflow=0, which would basically lead to a deadlock if you try to open two connections at the same time in one thread....