cr.execute在OpenERP开发中意味着什么?

问题描述 投票:2回答:2

我一直在尝试通过Python学习Open ERP模块开发。我找到了一个源代码,我不认为我理解。我在浏览时尝试过很少的互联网链接,但无法满足有用的链接。我需要理解这一点。

cr.execute("""
            SELECT a.id as id, COALESCE(MAX(l.date),a.purchase_date) AS date
            FROM account_asset_asset a
            LEFT JOIN account_move_line l ON (l.asset_id = a.id)
            WHERE a.id IN %s
            GROUP BY a.id, a.purchase_date """, (tuple(ids),))
        return dict(cr.fetchall())

请回复,希望提出建议,祝福,谢谢。

python eclipse openerp
2个回答
3
投票

只是想在这里添加一些要点,所以我认为它应该得到一个单独的答案:

  • cr(cursor)不是psycopg2游标,它是一个包含psycopg2游标的OpenERP类。它通常将大多数方法调用传递给封装的psyco游标,但它确实实现了一些自己的,如close,execute等。在OpenERP 7中查看sql_db.py
  • 为了纠正Andrei的例子,OpenERP游标是不可迭代的,如果你试图迭代它,你会看到: for row in cr: TypeError: 'Cursor' object is not iterable 有一天,我会绕过这个问题。
  • fetchone和fetchall方法被传递给底层的pscyo游标,因此请阅读那些文档上的标准文档。
  • 对于一般用途,如果你执行了cr.execute,结果集只会在你执行其他操作之前,例如ORM写入等。
  • cr.execute通常仅用于特殊情况,或运行复杂的SQL连接等。在您确定ORM不会及时执行您想要的操作之后,它应该只是一个手段。
  • 不要尝试自己管理提供的cr对象上的事务。如果您需要执行此操作以防止长时间运行的事务,例如隔夜计算更新,请创建和管理您自己的游标。请查看认证采购模块的示例。
  • 在开始汇编查询之前,请确保您了解SQL注入是什么以及使用查询参数的正确方法(在psycopg2中检查游标类的文档)。

2
投票

如你所知,cr是一个数据库游标。它允许您直接在数据库上执行SQL查询并获取结果。

它的工作方式没什么特别之处:

执行SQL代码:

cr.execute("some sql code")

检索结果:

cr.fetchone()
cr.fetchall()
etc...

您还可以迭代光标:

for rec in cr:
    print(rec)

有关游标对象的更多信息,您可能需要查看Psycopg documentation

在OpenERP中,cr对象在osv / orm代码中的某处初始化,并且在您创建为osv.osv的子类的模型中可用。

现在我很难过,我必须注意到,通常你不想在OpenERP中使用直接SQL查询。 OpenERP为您提供整个对象关系模型(orm)作为数据库层的抽象。例如,如果要在代码中的某个位置访问account_asset_asset模型,则应该更喜欢使用orm的OpenERP方法的“native”:

asset_obj = self.pool.get('account.asset.asset')
asset_ids = asset_obj.search(cr, uid, [('date', '>', start_date), ('date', '<', end_date)])
assets = asset_obj.browse(cr, uid, asset_ids, context=your_context)
for asset in assets:
    print asset

保留cr功能,用于某些特定情况,其中“本机”方法将是havy。

© www.soinside.com 2019 - 2024. All rights reserved.