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
这样的写法的含义和规则:
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
和sale_order_line.price_total
中的name
和price_total
其实是 列名,而不是 Python 对象的属性。sale_order
和sale_order_line
是表的别名(alias),它们代表数据库中的不同表。- 通过
sale_order.name
和sale_order_line.price_total
,SQL 知道你要从sale_order
表和sale_order_line
表中选择哪些列。
点号语法在 SQL 中的含义:
在 SQL 中,点号用于区分表名和列名。这是 SQL 的语法规则之一,它不是面向对象的属性访问。
sale_order.name
中的sale_order
是表名,name
是该表中的列名。- 如果查询有多个表,且不同表中可能有相同名称的列,点号用来指定某个表的特定列。例如,
sale_order.name
和sale_order_line.name
会指向不同表中的name
列。
什么时候能使用 .name
(类似的属性访问)?
- 在 SQL 查询中,点号表示 "表名.列名" 或 "别名.列名"。
- 如果你使用了 表的别名(例如
sale_order AS so
),你可以通过别名来引用列,如so.name
,它等价于sale_order.name
。
对比 Python 中的对象属性访问
在 Python 中,你可以通过 对象.属性
的方式访问实例的属性。但是 SQL 中的 表.列
语法是通过表名或别名来访问字段,而不是对象属性。它们虽然语法上有些相似,但语义完全不同。
例如:
- Python 中:
object.name
访问的是对象object
的name
属性。 - 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.name
、sale_order_line.price_total
- 示例:
- 在 Odoo ORM 中,你使用模型对象的字段名来访问字段。
- 示例:
order.name
、order_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
字段。