From 34684cf8dc22ac63a09df4287a4386e37508bd20 Mon Sep 17 00:00:00 2001 From: nixx Date: Fri, 3 May 2024 13:40:56 +0300 Subject: [PATCH] create table similar to other table --- README.md | 16 +++++++++++++--- .../clickhouse/schema_creation.rb | 3 ++- .../connection_adapters/clickhouse_adapter.rb | 6 +++++- lib/clickhouse-activerecord/version.rb | 2 +- .../1_create_some_table.rb | 11 +++++++++++ spec/single/migration_spec.rb | 9 +++++++++ 6 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 spec/fixtures/migrations/dsl_table_buffer_creation/1_create_some_table.rb diff --git a/README.md b/README.md index f67365fc..176e6eba 100644 --- a/README.md +++ b/README.md @@ -202,7 +202,7 @@ false`. The default integer is `UInt32` Example: -``` ruby +```ruby class CreateDataItems < ActiveRecord::Migration[7.1] def change create_table "data_items", id: false, options: "VersionedCollapsingMergeTree(sign, version) PARTITION BY toYYYYMM(day) ORDER BY category", force: :cascade do |t| @@ -230,8 +230,8 @@ end Create table with custom column structure: -``` ruby -class CreateDataItems < ActiveRecord::Migration +```ruby +class CreateDataItems < ActiveRecord::Migration[7.1] def change create_table "data_items", id: false, options: "MergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY timestamp", force: :cascade do |t| t.column "timestamp", "DateTime('UTC') CODEC(DoubleDelta, LZ4)" @@ -240,6 +240,16 @@ class CreateDataItems < ActiveRecord::Migration end ``` +Create Buffer table with connection database name: + +```ruby +class CreateDataItems < ActiveRecord::Migration[7.1] + def change + create_table :some_buffers, as: :some, options: "Buffer(#{connection.database}, some, 1, 10, 60, 100, 10000, 10000000, 100000000)" + end +end +``` + ### Using replica and cluster params in connection parameters diff --git a/lib/active_record/connection_adapters/clickhouse/schema_creation.rb b/lib/active_record/connection_adapters/clickhouse/schema_creation.rb index 7b36ea77..d3b015f9 100644 --- a/lib/active_record/connection_adapters/clickhouse/schema_creation.rb +++ b/lib/active_record/connection_adapters/clickhouse/schema_creation.rb @@ -88,6 +88,7 @@ def visit_TableDefinition(o) create_sql = +"CREATE#{table_modifier_in_create(o)} #{o.view ? "VIEW" : "TABLE"} " create_sql << "IF NOT EXISTS " if o.if_not_exists create_sql << "#{quote_table_name(o.name)} " + add_as_clause!(create_sql, o) if o.as && !o.view add_to_clause!(create_sql, o) if o.materialized statements = o.columns.map { |c| accept c } @@ -103,7 +104,7 @@ def visit_TableDefinition(o) create_sql << "(#{statements.join(', ')})" if statements.present? # Attach options for only table or materialized view without TO section add_table_options!(create_sql, o) if !o.view || o.view && o.materialized && !o.to - add_as_clause!(create_sql, o) + add_as_clause!(create_sql, o) if o.as && o.view create_sql end diff --git a/lib/active_record/connection_adapters/clickhouse_adapter.rb b/lib/active_record/connection_adapters/clickhouse_adapter.rb index 48e4b9f8..b6faabd8 100644 --- a/lib/active_record/connection_adapters/clickhouse_adapter.rb +++ b/lib/active_record/connection_adapters/clickhouse_adapter.rb @@ -293,7 +293,7 @@ def create_table(table_name, **options, &block) options = apply_replica(table_name, options) td = create_table_definition(apply_cluster(table_name), **options) block.call td if block_given? - td.column(:id, options[:id], null: false) if options[:id].present? && td[:id].blank? + td.column(:id, options[:id], null: false) if options[:id].present? && td[:id].blank? && options[:as].blank? if options[:force] drop_table(table_name, options.merge(if_exists: true)) @@ -431,6 +431,10 @@ def replica @config[:replica_name] end + def database + @config[:database] + end + def use_default_replicated_merge_tree_params? database_engine_atomic? && @config[:use_default_replicated_merge_tree_params] end diff --git a/lib/clickhouse-activerecord/version.rb b/lib/clickhouse-activerecord/version.rb index 0cf70564..e8cd30b3 100644 --- a/lib/clickhouse-activerecord/version.rb +++ b/lib/clickhouse-activerecord/version.rb @@ -1,3 +1,3 @@ module ClickhouseActiverecord - VERSION = '1.0.7' + VERSION = '1.0.8' end diff --git a/spec/fixtures/migrations/dsl_table_buffer_creation/1_create_some_table.rb b/spec/fixtures/migrations/dsl_table_buffer_creation/1_create_some_table.rb new file mode 100644 index 00000000..c50e7a12 --- /dev/null +++ b/spec/fixtures/migrations/dsl_table_buffer_creation/1_create_some_table.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class CreateSomeTable < ActiveRecord::Migration[5.0] + def up + create_table :some do + + end + create_table :some_buffers, as: :some, options: "Buffer(#{connection.database}, some, 1, 10, 60, 100, 10000, 10000000, 100000000)" + end +end + diff --git a/spec/single/migration_spec.rb b/spec/single/migration_spec.rb index deedd846..ac64d7ff 100644 --- a/spec/single/migration_spec.rb +++ b/spec/single/migration_spec.rb @@ -58,6 +58,15 @@ end end + context 'with buffer table' do + let(:directory) { 'dsl_table_buffer_creation' } + it 'creates a table' do + subject + + expect(ActiveRecord::Base.connection.tables).to include('some_buffers') + end + end + context 'with engine' do let(:directory) { 'dsl_table_with_engine_creation' } it 'creates a table' do