跳至内容
菜单
此问题已终结
2 回复
11801 查看

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?

形象
丢弃
编写者 最佳答案

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.

形象
丢弃
最佳答案

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)

形象
丢弃
编写者

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.

相关帖文 回复 查看 活动
2
7月 25
1536
2
9月 24
2011
4
7月 24
33918
0
11月 23
1935
9
3月 24
118073