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)


101
102
103
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 101

def self.using_database_configurations?
  true
end

Instance Method Details

#charset(_master_configuration_hash = configuration_hash) ⇒ Object

Charset (not applicable to ClickHouse)



201
202
203
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 201

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

#collation(_master_configuration_hash = configuration_hash) ⇒ Object

Collation (not applicable to ClickHouse)



206
207
208
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 206

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



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 108

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



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 131

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



152
153
154
155
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 152

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



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

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



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/clickhouse_ruby/active_record/railtie.rb', line 183

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