SQL中的。和python中的。的区别。让你彻底明白 。

SELECT sale_order.name, SUM(sale_order_line.price_total) as total_amount FROM sale_order JOIN sale_order_line AS sale_order_line ON sale_order.id = sale_order_line.order_id GROUP BY sale_order.id 像上面的语句中,sale_order.name 为什么这个可以.name 能像python那样对象.属性吗。 有什么规则,怎么区别,什么时候 能用.name,或者.其它属性

在 SQL 查询中,你提到的 sale_order.name 其实并不是像 Python 那样的对象属性访问,而是 SQL 中表的列名。在 SQL 中,.(点号)是用来区分不同层级的标识符的,通常用于区分表名与字段名(列名)。

让我们逐步解析这段 SQL 查询,并讨论 .name 这样的写法的含义和规则:

SQL 查询解析:
SELECT sale_order.name, SUM(sale_order_line.price_total) as total_amount
FROM sale_order
JOIN sale_order_line AS sale_order_line ON sale_order.id = sale_order_line.order_id
GROUP BY sale_order.id

 

  • sale_order.namesale_order_line.price_total 中的 nameprice_total 其实是 列名,而不是 Python 对象的属性。
  • sale_ordersale_order_line 是表的别名(alias),它们代表数据库中的不同表。
  • 通过 sale_order.namesale_order_line.price_total,SQL 知道你要从 sale_order 表和 sale_order_line 表中选择哪些列。

点号语法在 SQL 中的含义:

在 SQL 中,点号用于区分表名和列名。这是 SQL 的语法规则之一,它不是面向对象的属性访问。

  • sale_order.name 中的 sale_order 是表名,name 是该表中的列名。
  • 如果查询有多个表,且不同表中可能有相同名称的列,点号用来指定某个表的特定列。例如,sale_order.namesale_order_line.name 会指向不同表中的 name 列。

什么时候能使用 .name(类似的属性访问)?

  • 在 SQL 查询中,点号表示 "表名.列名" 或 "别名.列名"。
  • 如果你使用了 表的别名(例如 sale_order AS so),你可以通过别名来引用列,如 so.name,它等价于 sale_order.name

对比 Python 中的对象属性访问

在 Python 中,你可以通过 对象.属性 的方式访问实例的属性。但是 SQL 中的 表.列 语法是通过表名或别名来访问字段,而不是对象属性。它们虽然语法上有些相似,但语义完全不同。

例如:

  • Python 中object.name 访问的是对象 objectname 属性。
  • SQL 中table.name 访问的是表 table 中的 name 列。

Odoo ORM 中如何映射 SQL 查询到对象

在 Odoo 中,当你使用 ORM 时,点号(.)的行为类似于 Python 对象的属性访问。Odoo ORM 会把字段映射为模型的属性。例如,Odoo 中的 sale_order.name 实际上是访问 sale.order 模型的 name 字段。它背后会查询数据库中的 sale_order 表,并提取 name 列的值。

示例:

order = self.env['sale.order'].browse(order_id)
print(order.name)  # 这会访问 sale.order 表中的 name 列

在这种情况下,Odoo ORM 会自动生成对应的 SQL 查询,并通过表的字段来获取数据。这里的 order.name 实际上是访问 Odoo 模型 sale.order 中定义的字段,而 Odoo 会在背后处理与数据库的交互。

什么时候使用表的列名,什么时候使用模型的字段名?

  • 在 SQL 查询中,你直接引用 表名.列名别名.列名
    • 示例:sale_order.namesale_order_line.price_total
  • 在 Odoo ORM 中,你使用模型对象的字段名来访问字段。
    • 示例:order.nameorder_line.price_total

总结

  • SQL 查询 中,. 是用来表示表或表的别名和列之间的关系(例如 sale_order.name)。它并不是面向对象的属性访问,而是表的字段访问。
  • Odoo ORM 中,模型的字段可以通过 . 来访问,类似于 Python 中的属性访问。这是因为 Odoo 的 ORM 会自动将字段映射到数据库表的列。

所以,sale_order.name 在 SQL 中的含义是:访问 sale_order 表中的 name 列,而在 Odoo ORM 中,order.name 是访问 sale.order 模型中的 name 字段。

posted @ 2025-01-16 17:37  *感悟人生*  阅读(65)  评论(0)    收藏  举报