This question has been flagged
2 Replies
10307 Views

When I need a new Cursor() for a database, I have at least 2 ways to initialize a new one.

Using the helpers functions in openerp.pooler:

cr = openerp.pooler.get_db('name_of_my_database').cursor()  # or
db, pool = openerp.pooler.get_db_and_pool('name_of_my_database')
cr = db.cursor()

Or using openerp.sql_db.db_connect:

cr = openerp.sql_db.db_connect('name_of_my_database').cursor()

Note that both are used in OpenERP server or addons.

What is the difference between them and for which use case should I use one or the other function?

Avatar
Discard
Author Best Answer

By a reading of the functions, I found that:

openerp.pooler.get_db get the Registry for the database and returns the db attribute of the Registry. Registry().db is initialized using openerp.sql_db.db_connect.

At end, they both return an instance of a openerp.sql_db.Connection which respond to cursor().

It seems to me that we can use one or the other equally. openerp.pooler.get_db appears to be more 'High-Level' and needs to already have a Registry for the database.

My feeling is that we should use openerp.sql_db.db_connect only when we are not sure that we have a Registry for the database (during start or update of modules), otherwise we should prefer to use openerp.pooler.get_db.

Avatar
Discard
Best Answer

This is a standard design pattern. Applications usually pool all their database connections so that each module does not have to create its on database connection (as they are very costly)

You should always use the pooler.get_db, which underneath creates a connection if needed. But, if the pooler already has a connection, it saves you a lot of time and gives it to you.

Just do repeat, you should always avoid making direct database connections and use the pooler (think of like like a car pool)

Avatar
Discard
Author

Thanks for your answer. However the pool of connections is more low level than the methods I mentioned, both methods will reach the pooler. The pooler is actually used when you call cursor() on the Connection object. The API / documentation is not clear about that and I could find code using both methods, hence my question.