我有一个很大的分区表,在执行SELECT查询之前我知道分区名。
在香草SQL语法是SELECT * FROM objects PARTITION (p1)
我目前的解决方案似乎是工作,但看起来有点粗糙:
active_record_relation.to_sql.gsub('FROM `objects`', "FROM `objects` PARTITION(#{explicit_partition_name})")
我想知道是否有一个更习惯的ActiveRecord解决方案?
只是为了清楚,我知道分区修剪,但我不能使用它,因为分区哈希/查找逻辑是一个外部组件/系统。
数据库是MySQL。
就因为我偶然发现了这篇文章,所以你可以以一种侧面的方式构建它
partition_name = 'p1'
active_record_relation.from(
Arel::Nodes::UnaryOperation.new(
active_record_relation.arel_table.name,
Arel::Nodes::NamedFunction.new('PARTITION',[Arel.sql(partition_name)])
)
)
这将生成所需的SQL
SELECT
objects.*
FROM
objects PARTITION(p1)
完整示例:
table = Arel::Table.new('objects')
table
.project(table[Arel.star])
.from(Arel::Nodes::UnaryOperation.new(
table.name,
Arel::Nodes::NamedFunction.new('PARTITION',[Arel.sql('p1')])))
.to_sql