3

这是我的 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()

这给出了以下输出

导致 openerp

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

pgAdmin 结果

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

4

1 回答 1

0

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

检查sql_db.py类的文件Cursor并阅读那里的文档。基本上cr对象就是这个类的一个实例,这个类基本上包装了psycopg2改变功能的Cursor。检查execute那里的方法,你会发现它没有直接调用executepsycopg 的方法,而是先进行一些处理。尝试打印params那里以查看最终传递了哪些参数。

最后,即使您使用的是原始 sql,您仍在使用 Odoo 的 ORM,这意味着附加参数/限制已经到位。

例如,在 pgadmin 上,您(可能)对数据具有不受限制的访问权限,但使用游标时,您拥有与self.env.uid.

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

于 2017-01-19T16:15:28.000 回答