【odoo | SQL】odoo使用sql语句操作数据库

概要

        Odoo的SQL指的是在Odoo框架内使用SQL语句直接操作数据库。这些操作通常是通过Odoo提供的数据库游标(self.env.cr)来执行的。虽然Odoo主要鼓励使用其ORM(对象关系映射)来进行数据库操作,因为ORM更安全、易维护且与Odoo的模型和视图系统深度集成,但在某些情况下,直接使用SQL查询可能更高效或更直接。

使用场景

  • 复杂查询

    • 当需要执行复杂的SQL查询,如多表连接、嵌套查询或使用特定的SQL函数时,直接编写SQL查询可能更高效和直接。
    • 示例:获取某个时间段内的销售统计数据,涉及多个表的联合查询。
  • 性能优化

    • 在某些情况下,直接使用SQL查询可能比使用ORM方法更快。例如,批量数据处理或需要高性能的读写操作。
    • 示例:大批量插入数据或更新操作。
  • 数据迁移和转换

    • 在数据迁移、清理或转换过程中,直接使用SQL查询可以简化操作。
    • 示例:将数据从一个模型迁移到另一个模型或批量更新数据格式。
  • 报告和分析

    • 在生成复杂的报表和数据分析时,直接使用SQL查询可以更灵活地获取所需数据。
    • 示例:自定义财务报告或销售分析。
  • 操作系统特性

    • 某些数据库特定的功能,如存储过程、触发器等,可能需要直接使用SQL来调用和管理。
    • 示例:调用PostgreSQL的特定函数或特性。

用法

准备一个模型:

from odoo import api, fields, models, modules, tools, _
import logging
_logger = logging.getLogger(__name__)

class AllFieldAbout(models.Model):
    _name = "all.field.about"
    _description = """字段相关内容"""

    char_field = fields.Char('name字段')

 实现需求:使用SQL查询和更新all.field.about模型中id为2的记录,并将char_field的值更改为“小羊肖恩”。

    def button_go_sql(self):
        """
        odoo中的sql语句
        """
        # 获取数据库游标
        cr = self.env.cr

        try:
            # 查询id为2的记录
            select_query = """
                    SELECT id, char_field
                    FROM all_field_about
                    WHERE id = %s
                    """
            cr.execute(select_query, (2,))
            record = cr.fetchone()

            if record:
                _logger.info(f"Record before update: ID={record[0]}, char_field={record[1]}")

                # 更新char_field的值为“小羊肖恩”
                update_query = """
                        UPDATE all_field_about
                        SET char_field = %s
                        WHERE id = %s
                        """
                cr.execute(update_query, ('小羊肖恩', 2))

                # 提交事务
                cr.commit()
                _logger.info(f"Record with ID=2 updated successfully.")
            else:
                _logger.warning("No record found with ID=2.")

        except Exception as e:
            # 发生异常时回滚事务
            cr.rollback()
            _logger.error(f"Error executing SQL: {e}")
            raise

小结

        多写多敲多思考,毕竟,知己知彼才能看懂源码。

Tip:本人才学尚浅,如有纰漏,还请不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值