为什么OpenERP报告查询结果与SQL查询结果不同?

时间:2013-10-02 11:28:46

标签: python xml openerp

这是我的Python代码:

class sign_in_out_model_class(osv.osv):
    _name = "sign.in.out"
    _description = "Sign In / Out Report" 
    _auto = False
    _columns = {
        'name': fields.char('Emp No', size=128, readonly=True,select=True),
        'reldate':fields.char('Date', readonly=True,select=True),
        'sign_in': fields.char('Sign In', readonly=True,select=True),
        'sign_out': fields.char('Sign Out', readonly=True,select=True),
    }
    _order = 'sign_in asc'

    def init(self, cr):
        tools.sql.drop_view_if_exists(cr, 'sign_in_out')
        cr.execute("""CREATE OR REPLACE VIEW sign_in_out AS (
                        select max(dup_id) as id,name,
to_char(min(date),'YY/MM/DD') as reldate,
to_char(min(date),'HH12:MIam') as sign_in,
to_char(max(date),'HH12:MIam') as sign_out 
from text_based_attendance 
group by date(date),name)""")

sign_in_out_model_class()

其中给出了以下输出

result in openerp

但是当我在pgAdmin中运行该查询时,它会给出以下结果

pgAdmin result

我需要知道这种差异的原因是什么? 我的编码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

Cursor类由psycopg2定义,并由Odoo框架扩展。这意味着您可能认为使用cr.execute执行原始查询,但事实并非如此。

检查班级sql_db.py的{​​{1}}文件并阅读其中的文档。基本上cr对象是这个类的一个实例,这个类基本上包含了Cursor更改功能的Cursor。检查那里的psycopg2方法,你会发现它没有直接调用psycopg的execute方法,而是首先进行一些处理。尝试在那里打印execute以查看最后传递的参数。

最后,即使您使用的是原始SQL,您仍然使用Odoo的ORM,这意味着还有其他参数/​​限制。

例如,在pgadmin上,您(可能)可以无限制地访问数据,但使用Cursor,您拥有与params中用户相同的访问权限。

另外,请检查documentation,因为缓存可能是您看到不同结果的原因。