Class: ClickhouseRuby::ActiveRecord::DatabaseTasks

Inherits:
Object
  • Object
show all
Defined in:
lib/clickhouse_ruby/active_record/railtie.rb

Overview

Database tasks for Rails (db:create, db:drop, etc.)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.using_database_configurations?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 82

def self.using_database_configurations?
  true
end

Instance Method Details

#charset(_master_configuration_hash = configuration_hash) ⇒ Object

Charset (not applicable to ClickHouse)



182
183
184
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 182

def charset(_master_configuration_hash = configuration_hash)
  'UTF-8'
end

#collation(_master_configuration_hash = configuration_hash) ⇒ Object

Collation (not applicable to ClickHouse)



187
188
189
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 187

def collation(_master_configuration_hash = configuration_hash)
  nil
end

#create(master_configuration_hash = configuration_hash) ⇒ Object

Create a ClickHouse database

Parameters:

  • master_configuration_hash (Hash) (defaults to: configuration_hash)

    database configuration



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 89

def create(master_configuration_hash = configuration_hash)
  config = master_configuration_hash.symbolize_keys
  database = config[:database]

  return if database.nil? || database.empty?

  # Connect without database to create it
  temp_config = config.dup
  temp_config[:database] = 'default'

  adapter = ConnectionAdapter.new(nil, nil, nil, temp_config)
  adapter.connect
  adapter.create_database(database, if_not_exists: true)
  adapter.disconnect!

  puts "Created database '#{database}'"
rescue ClickhouseRuby::Error => e
  raise "Failed to create database '#{database}': #{e.message}"
end

#drop(master_configuration_hash = configuration_hash) ⇒ Object

Drop a ClickHouse database

Parameters:

  • master_configuration_hash (Hash) (defaults to: configuration_hash)

    database configuration



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 112

def drop(master_configuration_hash = configuration_hash)
  config = master_configuration_hash.symbolize_keys
  database = config[:database]

  return if database.nil? || database.empty?

  # Connect without database to drop it
  temp_config = config.dup
  temp_config[:database] = 'default'

  adapter = ConnectionAdapter.new(nil, nil, nil, temp_config)
  adapter.connect
  adapter.drop_database(database, if_exists: true)
  adapter.disconnect!

  puts "Dropped database '#{database}'"
rescue ClickhouseRuby::Error => e
  raise "Failed to drop database '#{database}': #{e.message}"
end

#purge(master_configuration_hash = configuration_hash) ⇒ Object

Purge (drop and recreate) a ClickHouse database



133
134
135
136
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 133

def purge(master_configuration_hash = configuration_hash)
  drop(master_configuration_hash)
  create(master_configuration_hash)
end

#structure_dump(master_configuration_hash, filename) ⇒ Object

Return structure dump (schema)

Parameters:

  • master_configuration_hash (Hash)

    database configuration

  • filename (String)

    path to dump file



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 142

def structure_dump(master_configuration_hash, filename)
  config = master_configuration_hash.symbolize_keys

  adapter = ConnectionAdapter.new(nil, nil, nil, config)
  adapter.connect

  File.open(filename, 'w') do |file|
    # Dump each table's CREATE statement
    adapter.tables.each do |table_name|
      result = adapter.execute("SHOW CREATE TABLE #{adapter.quote_table_name(table_name)}")
      create_statement = result.first['statement'] || result.first['Create Table']
      file.puts "#{create_statement};\n\n"
    end
  end

  adapter.disconnect!
end

#structure_load(master_configuration_hash, filename) ⇒ Object

Load structure from dump file

Parameters:

  • master_configuration_hash (Hash)

    database configuration

  • filename (String)

    path to dump file



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 164

def structure_load(master_configuration_hash, filename)
  config = master_configuration_hash.symbolize_keys

  adapter = ConnectionAdapter.new(nil, nil, nil, config)
  adapter.connect

  # Read and execute each statement
  sql = File.read(filename)
  statements = sql.split(/;\s*\n/).reject(&:empty?)

  statements.each do |statement|
    adapter.execute(statement.strip) unless statement.strip.empty?
  end

  adapter.disconnect!
end