clickhouse-activerecord 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1d313720b1a43f19f51e6fa9e88ef40d136130e9
4
- data.tar.gz: e82dbfb65bd38fa50df9304690bd116eef021a70
2
+ SHA256:
3
+ metadata.gz: 69358e69c13cdf1d70ec417e4ef9e4374578eb63144bc713bdd3e934702d8118
4
+ data.tar.gz: 2a52857c0080ad2959c8d34b52a43185f911ff215ac52c1584dacc52e3047f1e
5
5
  SHA512:
6
- metadata.gz: 8fed861c69428580cddb00c79656ac7614bd26f5c47cdc0a6e4378b0578f4935aec86430b5523f599a97753be329482a8e766471b505d1fd04961ad98ac0415f
7
- data.tar.gz: 581d95bdc952a7be4d5645ea0948011f7c67ca6b145c3607774a9770997382fa36279b6029b4128d43909948658b956db64d0d185351eee1f6f756cbaa36bd7c
6
+ metadata.gz: b7a6c0845166b79e719e1fff667de0dfb38e132154a6acdf862d50cb82d7281dbecd53f4c4e756b5bc5e30ad3b6b3aa710eebb8220f0f496991fd4e01513238f
7
+ data.tar.gz: f3987a2a0a77233a37ecb1805b6e4bd0dce76ce2bf2c18fc58e62ee62bb9a573ac8851cf06f56d0b1bf80e8fe3a14eda1105fdd3f472c4f54694fd0811fd2bcd
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Clickhouse::Activerecord
2
2
 
3
3
  A Ruby database ActiveRecord driver for ClickHouse. Support Rails >= 5.2.
4
+ Tested on ClickHouse version 18.14.
4
5
 
5
6
  ## Installation
6
7
 
@@ -17,8 +18,22 @@ And then execute:
17
18
  Or install it yourself as:
18
19
 
19
20
  $ gem install clickhouse-activerecord
21
+
22
+ ## Available database connection parameters
23
+ ```yml
24
+ default: &default
25
+ adapter: clickhouse
26
+ database: database
27
+ host: localhost
28
+ port: 8123
29
+ username: username
30
+ password: password
31
+ ssl: true # optional for using ssl connection
32
+ debug: true # use for showing in to log technical information
33
+ migrations_paths: db/clickhouse # optional, default: db/migrate_clickhouse
34
+ ```
20
35
 
21
- ## Usage
36
+ ## Usage in Rails 5
22
37
 
23
38
  Add your `database.yml` connection information with postfix `_clickhouse` for you environment:
24
39
 
@@ -26,10 +41,6 @@ Add your `database.yml` connection information with postfix `_clickhouse` for yo
26
41
  development_clickhouse:
27
42
  adapter: clickhouse
28
43
  database: database
29
- host: localhost
30
- username: username
31
- password: password
32
- debug: true # use for showing in to log technical information
33
44
  ```
34
45
 
35
46
  Add to your model:
@@ -54,13 +65,34 @@ Or global connection:
54
65
  development:
55
66
  adapter: clickhouse
56
67
  database: database
57
- host: localhost
58
- username: username
59
- password: password
68
+ ```
69
+
70
+ ## Usage in Rails 6 with second database
71
+
72
+ Add your `database.yml` connection information for you environment:
73
+
74
+ ```yml
75
+ development:
76
+ primary:
77
+ ...
78
+
79
+ clickhouse:
80
+ adapter: clickhouse
81
+ database: database
82
+ ```
83
+
84
+ Connection [Multiple Databases with Active Record](https://guides.rubyonrails.org/active_record_multiple_databases.html) or short example:
85
+
86
+ ```ruby
87
+ class Action < ActiveRecord::Base
88
+ connects_to database: { writing: :clickhouse, reading: :clickhouse }
89
+ end
60
90
  ```
61
91
 
62
92
  ### Rake tasks
63
93
 
94
+ **Note!** For Rails 6 you can use default rake tasks if you configure `migrations_paths` in your `database.yml`, for example: `rake db:migrate`
95
+
64
96
  Create / drop / purge / reset database:
65
97
 
66
98
  $ rake clickhouse:create
@@ -38,37 +38,6 @@ module ActiveRecord
38
38
  { options: sql.gsub(/^(?:.*?)ENGINE = (.*?)$/, '\\1') }
39
39
  end
40
40
 
41
- # @todo copied from ActiveRecord::ConnectionAdapters::SchemaStatements v5.2.2
42
- # Why version column type of String, but insert to Integer?
43
- def assume_migrated_upto_version(version, migrations_paths)
44
- migrations_paths = Array(migrations_paths)
45
- version = version.to_i
46
- sm_table = quote_table_name(ActiveRecord::SchemaMigration.table_name)
47
-
48
- migrated = ActiveRecord::SchemaMigration.all_versions.map(&:to_i)
49
- versions = migration_context.migration_files.map do |file|
50
- migration_context.parse_migration_filename(file).first.to_i
51
- end
52
-
53
- unless migrated.include?(version)
54
- do_execute( "INSERT INTO #{sm_table} (version) VALUES (#{quote(version.to_s)})", 'SchemaMigration', format: nil)
55
- end
56
-
57
- inserting = (versions - migrated).select { |v| v < version }
58
- if inserting.any?
59
- if (duplicate = inserting.detect { |v| inserting.count(v) > 1 })
60
- raise "Duplicate migration #{duplicate}. Please renumber your migrations to resolve the conflict."
61
- end
62
- if supports_multi_insert?
63
- do_system_execute insert_versions_sql(inserting.map(&:to_s))
64
- else
65
- inserting.each do |v|
66
- do_system_execute insert_versions_sql(v)
67
- end
68
- end
69
- end
70
- end
71
-
72
41
  # Not indexes on clickhouse
73
42
  def indexes(table_name, name = nil)
74
43
  []
@@ -86,21 +55,22 @@ module ActiveRecord
86
55
  end
87
56
  end
88
57
 
89
- private
90
-
91
- def apply_format(sql, format)
92
- format ? "#{sql} FORMAT #{format}" : sql
93
- end
94
-
95
- def do_execute(sql, name = nil, format: 'JSONCompact')
58
+ def do_execute(sql, name = nil, format: 'JSONCompact', settings: {})
96
59
  log(sql, "#{adapter_name} #{name}") do
97
60
  formatted_sql = apply_format(sql, format)
98
- res = @connection.post("/?#{@config.to_param}", formatted_sql)
61
+ request_params = @config || {}
62
+ res = @connection.post("/?#{request_params.merge(settings).to_param}", formatted_sql)
99
63
 
100
64
  process_response(res)
101
65
  end
102
66
  end
103
67
 
68
+ private
69
+
70
+ def apply_format(sql, format)
71
+ format ? "#{sql} FORMAT #{format}" : sql
72
+ end
73
+
104
74
  def process_response(res)
105
75
  case res.code.to_i
106
76
  when 200
@@ -121,7 +91,11 @@ module ActiveRecord
121
91
  end
122
92
 
123
93
  def create_table_definition(*args)
124
- Clickhouse::TableDefinition.new(*args)
94
+ if ActiveRecord::version >= Gem::Version.new('6')
95
+ Clickhouse::TableDefinition.new(self, *args)
96
+ else
97
+ Clickhouse::TableDefinition.new(*args)
98
+ end
125
99
  end
126
100
 
127
101
  def new_column_from_field(table_name, field)
@@ -18,6 +18,7 @@ module ActiveRecord
18
18
  config = config.symbolize_keys
19
19
  host = config[:host] || 'localhost'
20
20
  port = config[:port] || 8123
21
+ ssl = config[:ssl].present? ? config[:ssl] : port == 443
21
22
 
22
23
  if config.key?(:database)
23
24
  database = config[:database]
@@ -25,7 +26,7 @@ module ActiveRecord
25
26
  raise ArgumentError, 'No database specified. Missing argument: database.'
26
27
  end
27
28
 
28
- ConnectionAdapters::ClickhouseAdapter.new(nil, logger, [host, port], { user: config[:username], password: config[:password], database: database }.compact, config[:debug])
29
+ ConnectionAdapters::ClickhouseAdapter.new(logger, [host, port, ssl], { user: config[:username], password: config[:password], database: database }.compact, config)
29
30
  end
30
31
  end
31
32
  end
@@ -92,21 +93,34 @@ module ActiveRecord
92
93
  include Clickhouse::SchemaStatements
93
94
 
94
95
  # Initializes and connects a Clickhouse adapter.
95
- def initialize(connection, logger, connection_parameters, config, debug = false)
96
- super(connection, logger)
96
+ def initialize(logger, connection_parameters, config, full_config)
97
+ super(nil, logger)
97
98
  @connection_parameters = connection_parameters
98
99
  @config = config
99
- @debug = debug
100
+ @debug = full_config[:debug] || false
101
+ @full_config = full_config
100
102
 
101
- if ActiveRecord::version >= Gem::Version.new('6')
103
+ @prepared_statements = false
104
+ if ActiveRecord::version == Gem::Version.new('6.0.0')
102
105
  @prepared_statement_status = Concurrent::ThreadLocalVar.new(false)
103
- else
104
- @prepared_statements = false
105
106
  end
106
107
 
107
108
  connect
108
109
  end
109
110
 
111
+ # Support SchemaMigration from v5.2.2 to v6+
112
+ def schema_migration # :nodoc:
113
+ if ActiveRecord::version >= Gem::Version.new('6')
114
+ super
115
+ else
116
+ ActiveRecord::SchemaMigration
117
+ end
118
+ end
119
+
120
+ def migrations_paths
121
+ @full_config[:migrations_paths] || 'db/migrate_clickhouse'
122
+ end
123
+
110
124
  def arel_visitor # :nodoc:
111
125
  ClickhouseActiverecord::Arel::Visitors::ToSql.new(self)
112
126
  end
@@ -217,8 +231,7 @@ module ActiveRecord
217
231
  private
218
232
 
219
233
  def connect
220
- # for ssl port need use ssl
221
- @connection = Net::HTTP.start(@connection_parameters[0], @connection_parameters[1], use_ssl: @connection_parameters[1] == 443)
234
+ @connection = Net::HTTP.start(@connection_parameters[0], @connection_parameters[1], use_ssl: @connection_parameters[2], verify_mode: OpenSSL::SSL::VERIFY_NONE)
222
235
  end
223
236
  end
224
237
  end
@@ -1,3 +1,3 @@
1
1
  module ClickhouseActiverecord
2
- VERSION = '0.3.8'
2
+ VERSION = '0.3.9'
3
3
  end
@@ -6,6 +6,20 @@ class ClickhouseMigrationGenerator < ActiveRecord::Generators::MigrationGenerato
6
6
  def create_migration_file
7
7
  set_local_assigns!
8
8
  validate_file_name!
9
- migration_template @migration_template, "db/migrate_clickhouse/#{file_name}.rb"
9
+ migration_template @migration_template, File.join(db_migrate_path, "#{file_name}.rb")
10
+ end
11
+
12
+ private
13
+
14
+ def db_migrate_path
15
+ if defined?(Rails.application) && Rails.application
16
+ configured_migrate_path || default_migrate_path
17
+ else
18
+ default_migrate_path
19
+ end
20
+ end
21
+
22
+ def default_migrate_path
23
+ "db/migrate_clickhouse"
10
24
  end
11
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clickhouse-activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Odintsov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-04 00:00:00.000000000 Z
11
+ date: 2019-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -147,8 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
147
  - !ruby/object:Gem::Version
148
148
  version: '0'
149
149
  requirements: []
150
- rubyforge_project:
151
- rubygems_version: 2.5.2.3
150
+ rubygems_version: 3.0.1
152
151
  signing_key:
153
152
  specification_version: 4
154
153
  summary: ClickHouse ActiveRecord