sequel-bigquery 0.4.1 → 0.4.2

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
2
  SHA256:
3
- metadata.gz: 288cbe303c3db264ccc9e71f7c39c63185428056bfebfe67e1cb520ddeef5243
4
- data.tar.gz: 583b3d835d03762ef0ba1ba821d6545032db97202a672b4cd08be9cd50e134d9
3
+ metadata.gz: e444c2d4a5c6b54b5a1bb0efde17e1dd83761ec53f1b796f5e959646bd37f315
4
+ data.tar.gz: 41875a2325c00eb26786fbd3ab8430e9880b93d795a18b000bff3dd75ed0ea47
5
5
  SHA512:
6
- metadata.gz: 2691185b162d701bc1c8d78acbb0ea7624716a10612eedbbcf5c4feb0d04f34b6ef5f7c1e8936052d3ab28a6196a75613c8c09aaa7713245105ddc989f0a1266
7
- data.tar.gz: e642c036248215c810e2c066b37f5864d753fa0ad52cb0352538c661e7ec41b475cf43cb5a0b7220d0410402e6b2100e02b1b4411ce4c2c8fd7511b810a7c928
6
+ metadata.gz: 725fce3447e58e75c5cf817d736322c567661752d1b2d2f4f45aa0ce712825e8792214d1f56313272d8a84facdadff51f63ee4a6b3bda1b8c55d92a80a826798
7
+ data.tar.gz: 3aa8900e8fba7400049e8f83879998b246296e1705d01b25f2a1cf20855cf8faeea09b9d7e4cb7280b2783296d0a27f61ed295275089d6de311c256c5f7ea763
data/README.md CHANGED
@@ -4,6 +4,10 @@
4
4
 
5
5
  A Sequel adapter for [Google's BigQuery](https://cloud.google.com/bigquery).
6
6
 
7
+ This gem was created in order to manage schema migrations of a BigQuery dataset at GreenSync. At the time of writing, we couldn't find any good tools in any language to manage changes to the schema as a set of migrations.
8
+
9
+ Beyond migrations, I'm unsure how useful this gem is. I haven't yet tested what the performance would be for data interactions vs. directly using the `google-cloud-bigquery` gem's native facilities. If you're inserting a bunch of data, it's probably a better idea to use an [inserter from that gem](https://googleapis.dev/ruby/google-cloud-bigquery/latest/Google/Cloud/Bigquery/Dataset.html#insert_async-instance_method) rather than going through SQL.
10
+
7
11
  ## Contents
8
12
 
9
13
  <!-- MarkdownTOC autolink=true -->
@@ -68,6 +72,7 @@ Connect to BigQuery:
68
72
 
69
73
  ```
70
74
  require 'sequel-bigquery'
75
+ require 'logger'
71
76
 
72
77
  db = Sequel.connect(
73
78
  adapter: :bigquery,
@@ -80,6 +85,8 @@ db = Sequel.connect(
80
85
 
81
86
  And use Sequel like normal.
82
87
 
88
+ Note that it is important to supply a logger that will at least output warning messages so you know when your queries are being modifed or buffered, which may be unexpected behaviour.
89
+
83
90
  ## Contributing
84
91
 
85
92
  Pull requests welcome! =)
@@ -4,6 +4,7 @@ require 'delegate'
4
4
  require 'time'
5
5
 
6
6
  require 'google/cloud/bigquery'
7
+ require 'amazing_print'
7
8
  require 'paint'
8
9
  require 'sequel'
9
10
 
@@ -16,39 +17,33 @@ module Sequel
16
17
  class Database < Sequel::Database # rubocop:disable Metrics/ClassLength
17
18
  set_adapter_scheme :bigquery
18
19
 
19
- def initialize(*args, **kawrgs)
20
- puts '.new'
21
- @orig_opts = kawrgs.fetch(:orig_opts)
20
+ def initialize(*args, **kwargs)
21
+ @bigquery_config = kwargs.fetch(:orig_opts)
22
22
  @sql_buffer = []
23
23
  @sql_buffering = false
24
24
  super
25
25
  end
26
26
 
27
27
  def connect(*_args)
28
- puts '#connect'
29
- config = @orig_opts.dup
30
- config.delete(:adapter)
31
- config.delete(:logger)
32
- location = config.delete(:location)
33
- bq_dataset_name = config.delete(:dataset) || config.delete(:database)
34
- @bigquery = Google::Cloud::Bigquery.new(config)
28
+ log_each(:debug, '#connect')
29
+ get_or_create_bigquery_dataset
30
+ .tap { log_each(:debug, '#connect end') }
31
+ end
32
+
33
+ def bigquery
35
34
  # ObjectSpace.each_object(HTTPClient).each { |c| c.debug_dev = STDOUT }
36
- @bigquery.dataset(bq_dataset_name) || begin
37
- @loggers[0].debug('BigQuery dataset %s does not exist; creating it' % bq_dataset_name)
38
- @bigquery.create_dataset(bq_dataset_name, location: location)
39
- end
40
- .tap { puts '#connect end' }
35
+ @bigquery ||= Google::Cloud::Bigquery.new(google_cloud_bigquery_gem_config)
41
36
  end
42
37
 
43
38
  def disconnect_connection(_c)
44
- puts '#disconnect_connection'
39
+ log_each(:debug, '#disconnect_connection')
45
40
  # c.disconnect
46
41
  end
47
42
 
48
43
  def drop_datasets(*dataset_names_to_drop)
49
44
  dataset_names_to_drop.each do |dataset_name_to_drop|
50
- puts "Dropping dataset #{dataset_name_to_drop.inspect}"
51
- dataset_to_drop = @bigquery.dataset(dataset_name_to_drop)
45
+ log_each(:debug, "Dropping dataset #{dataset_name_to_drop.inspect}")
46
+ dataset_to_drop = bigquery.dataset(dataset_name_to_drop)
52
47
  next unless dataset_to_drop
53
48
  dataset_to_drop.tables.each(&:delete)
54
49
  dataset_to_drop.delete
@@ -57,7 +52,7 @@ module Sequel
57
52
  alias drop_dataset drop_datasets
58
53
 
59
54
  def execute(sql, opts = OPTS) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
60
- puts '#execute'
55
+ log_each(:debug, '#execute')
61
56
  log_query(sql)
62
57
 
63
58
  # require 'pry'; binding.pry if sql =~ /CREATE TABLE IF NOT EXISTS/i
@@ -88,15 +83,12 @@ module Sequel
88
83
  sql_to_execute = @sql_buffer.any? ? @sql_buffer.join("\n") : sql
89
84
  conn.query(sql_to_execute)
90
85
  end
91
- require 'amazing_print'
92
- ap results
86
+ log_each(:debug, results.awesome_inspect)
93
87
  if block_given?
94
88
  yield results
95
89
  else
96
90
  results
97
91
  end
98
- # TODO
99
- # rescue ::ODBC::Error, ArgumentError => e
100
92
  rescue Google::Cloud::InvalidArgumentError, ArgumentError => e
101
93
  raise_error(e)
102
94
  end # rubocop:disable Style/MultilineBlockChain
@@ -124,6 +116,33 @@ module Sequel
124
116
 
125
117
  private
126
118
 
119
+ attr_reader :bigquery_config
120
+
121
+ def google_cloud_bigquery_gem_config
122
+ bigquery_config.dup.tap do |config|
123
+ %i[
124
+ adapter
125
+ database
126
+ dataset
127
+ location
128
+ logger
129
+ ].each do |option|
130
+ config.delete(option)
131
+ end
132
+ end
133
+ end
134
+
135
+ def get_or_create_bigquery_dataset # rubocop:disable Naming/AccessorMethodName
136
+ bigquery.dataset(bigquery_dataset_name) || begin
137
+ log_each(:debug, 'BigQuery dataset %s does not exist; creating it' % bigquery_dataset_name)
138
+ bigquery.create_dataset(bigquery_dataset_name, location: bigquery_config[:location])
139
+ end
140
+ end
141
+
142
+ def bigquery_dataset_name
143
+ bigquery_config[:dataset] || bigquery_config[:database] || (raise ArgumentError, 'BigQuery dataset must be specified')
144
+ end
145
+
127
146
  def connection_execute_method
128
147
  :query
129
148
  end
@@ -138,9 +157,9 @@ module Sequel
138
157
  end
139
158
 
140
159
  def schema_parse_table(_table_name, _opts)
141
- logger.debug(Paint['schema_parse_table', :red, :bold])
160
+ log_each(:debug, Paint['schema_parse_table', :red, :bold])
142
161
  # require 'pry'; binding.pry
143
- @bigquery.datasets.map do |dataset|
162
+ bigquery.datasets.map do |dataset|
144
163
  [
145
164
  dataset.dataset_id,
146
165
  {},
@@ -155,13 +174,12 @@ module Sequel
155
174
 
156
175
  # Padded to horizontally align with post-execution log message which includes the execution time
157
176
  def log_query(sql)
158
- pad = ' '
159
- puts Paint[pad + sql, :cyan, :bold]
160
- # @loggers[0]&.debug(' ' + sql)
177
+ pad = ' ' * 12
178
+ log_each(:debug, Paint[pad + sql, :cyan, :bold])
161
179
  end
162
180
 
163
181
  def warn(msg)
164
- @loggers[0].warn(Paint[msg, '#FFA500', :bold])
182
+ log_each(:warn, Paint[msg, '#FFA500', :bold])
165
183
  end
166
184
 
167
185
  def warn_default_removal(sql)
@@ -195,7 +213,7 @@ module Sequel
195
213
 
196
214
  class Dataset < Sequel::Dataset
197
215
  def fetch_rows(sql, &block)
198
- puts '#fetch_rows'
216
+ db.send(:log_each, :debug, '#fetch_rows')
199
217
 
200
218
  execute(sql) do |bq_result|
201
219
  self.columns = bq_result.fields.map { |field| field.name.to_sym }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sequel
4
4
  module Bigquery
5
- VERSION = '0.4.1'
5
+ VERSION = '0.4.2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-bigquery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brendan Weibrecht
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-28 00:00:00.000000000 Z
11
+ date: 2021-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amazing_print