我一直在尝试通过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())
请回复,希望提出建议,祝福,谢谢。
只是想在这里添加一些要点,所以我认为它应该得到一个单独的答案:
for row in cr:
TypeError: 'Cursor' object is not iterable
有一天,我会绕过这个问题。如你所知,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。