如何在Odoo中使用游标?

时间:2017-02-13 10:29:01

标签: python odoo odoo-9 database-cursor

我不明白在版本9中使用光标!你需要光标吗?

在下面的示例中,在控制台行中调用函数后得到:

<openerp.sql_db.Cursor object at 0x7f94f4c0b0d0>

@api.multi   
    def my_func(self):
        cursor = self.env.cr
        print(cursor)   

任何简单的例子何时以及为何使用游标?

2 个答案:

答案 0 :(得分:9)

游标对象基本上是Odoo用来与postgresql数据库通信的接口。

在Odoo中,您通常不必直接与它进行交互,但有时候您会遇到Odoo ORM不能给您带来理想结果的情况。这是您需要使用数据库游标时。对于无法使用ORM实现的SQL查询。

您也可以使用数据库游标来克服安全限制,尽管有人会说这是不可取的。但是,我不会评判你。

Odoo中的光标是数据库游标。它基本上是一个psycopg2数据库游标。我相信它已经被Odoo修改过了,但是不能给你一个已修改内容的具体例子。

以下是一些简单的例子。

@api.multi
def sql_example(self):
    sql = "SELECT * FROM table_name WHERE col = 'some_value'"

上面的查询可以是你想要的

    self.env.cr.execute(sql)
    for record in self.env.cr.fetchall():
        # YOUR CODE HERE

如果您想执行UPDATE / DELETE / CREATE功能,则必须提交更改。

    sql = "UPDATE table_name SET col = 'some_value' WHERE col = 'some_value'"
    self.env.cr.execute(sql)
    self.env.cr.commit()

有时您可能会在查询中找到缓存的数据。您可能需要刷新它。

    self.env.invalidate_all()

因此,如果您想更好地了解游标对象是什么,可以查看文档

Tutorials PointPsycopg2 DocsPostgresql Docs

底线,光标是您查询数据库的方式。您不必使用它,但如果您发现需要使用ORM获取无法获得的数据,则可以使用它。

答案 1 :(得分:2)

您可以使用 cr 在您的函数中执行查询。

@api.multi   
def my_func(self):
   cursor = self.env.cr
   cursor.execute("select * from res_partner")
   for partner in cursor.fetchall():
      ......
      ......