google-cloud-spanner 1.6.4 → 1.7.1
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/google/cloud/spanner/batch_snapshot.rb +43 -32
- data/lib/google/cloud/spanner/client.rb +221 -27
- data/lib/google/cloud/spanner/data.rb +1 -1
- data/lib/google/cloud/spanner/fields.rb +1 -1
- data/lib/google/cloud/spanner/partition.rb +16 -9
- data/lib/google/cloud/spanner/project.rb +2 -2
- data/lib/google/cloud/spanner/results.rb +73 -42
- data/lib/google/cloud/spanner/service.rb +18 -4
- data/lib/google/cloud/spanner/session.rb +39 -27
- data/lib/google/cloud/spanner/snapshot.rb +32 -24
- data/lib/google/cloud/spanner/transaction.rb +135 -25
- data/lib/google/cloud/spanner/version.rb +1 -1
- metadata +2 -2
@@ -33,7 +33,7 @@ module Google
|
|
33
33
|
# db = spanner.client "my-instance", "my-database"
|
34
34
|
#
|
35
35
|
# db.snapshot do |snp|
|
36
|
-
# results = snp.
|
36
|
+
# results = snp.execute_query "SELECT * FROM users"
|
37
37
|
#
|
38
38
|
# results.rows.each do |row|
|
39
39
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -128,7 +128,7 @@ module Google
|
|
128
128
|
# db = spanner.client "my-instance", "my-database"
|
129
129
|
#
|
130
130
|
# db.snapshot do |snp|
|
131
|
-
# results = snp.
|
131
|
+
# results = snp.execute_query "SELECT * FROM users"
|
132
132
|
#
|
133
133
|
# results.rows.each do |row|
|
134
134
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -142,7 +142,7 @@ module Google
|
|
142
142
|
# db = spanner.client "my-instance", "my-database"
|
143
143
|
#
|
144
144
|
# db.snapshot do |snp|
|
145
|
-
# results = snp.
|
145
|
+
# results = snp.execute_query "SELECT * FROM users " \
|
146
146
|
# "WHERE active = @active",
|
147
147
|
# params: { active: true }
|
148
148
|
#
|
@@ -160,11 +160,13 @@ module Google
|
|
160
160
|
# db.snapshot do |snp|
|
161
161
|
# user_hash = { id: 1, name: "Charlie", active: false }
|
162
162
|
#
|
163
|
-
# results = snp.
|
164
|
-
#
|
165
|
-
#
|
166
|
-
#
|
167
|
-
#
|
163
|
+
# results = snp.execute_query(
|
164
|
+
# "SELECT * FROM users WHERE " \
|
165
|
+
# "ID = @user_struct.id " \
|
166
|
+
# "AND name = @user_struct.name " \
|
167
|
+
# "AND active = @user_struct.active",
|
168
|
+
# params: { user_struct: user_hash }
|
169
|
+
# )
|
168
170
|
#
|
169
171
|
# results.rows.each do |row|
|
170
172
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -181,12 +183,14 @@ module Google
|
|
181
183
|
# user_type = snp.fields id: :INT64, name: :STRING, active: :BOOL
|
182
184
|
# user_hash = { id: 1, name: nil, active: false }
|
183
185
|
#
|
184
|
-
# results = snp.
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
186
|
+
# results = snp.execute_query(
|
187
|
+
# "SELECT * FROM users WHERE " \
|
188
|
+
# "ID = @user_struct.id " \
|
189
|
+
# "AND name = @user_struct.name " \
|
190
|
+
# "AND active = @user_struct.active",
|
191
|
+
# params: { user_struct: user_hash },
|
192
|
+
# types: { user_struct: user_type }
|
193
|
+
# )
|
190
194
|
#
|
191
195
|
# results.rows.each do |row|
|
192
196
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -203,30 +207,34 @@ module Google
|
|
203
207
|
# user_type = snp.fields id: :INT64, name: :STRING, active: :BOOL
|
204
208
|
# user_data = user_type.struct id: 1, name: nil, active: false
|
205
209
|
#
|
206
|
-
# results = snp.
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
210
|
-
#
|
210
|
+
# results = snp.execute_query(
|
211
|
+
# "SELECT * FROM users WHERE " \
|
212
|
+
# "ID = @user_struct.id " \
|
213
|
+
# "AND name = @user_struct.name " \
|
214
|
+
# "AND active = @user_struct.active",
|
215
|
+
# params: { user_struct: user_data }
|
216
|
+
# )
|
211
217
|
#
|
212
218
|
# results.rows.each do |row|
|
213
219
|
# puts "User #{row[:id]} is #{row[:name]}"
|
214
220
|
# end
|
215
221
|
# end
|
216
222
|
#
|
217
|
-
def
|
223
|
+
def execute_query sql, params: nil, types: nil
|
218
224
|
ensure_session!
|
219
225
|
|
220
226
|
params, types = Convert.to_input_params_and_types params, types
|
221
227
|
|
222
|
-
session.
|
223
|
-
|
228
|
+
session.execute_query sql, params: params, types: types,
|
229
|
+
transaction: tx_selector
|
224
230
|
end
|
225
|
-
alias
|
231
|
+
alias execute execute_query
|
232
|
+
alias query execute_query
|
233
|
+
alias execute_sql execute_query
|
226
234
|
|
227
235
|
##
|
228
236
|
# Read rows from a database table, as a simple alternative to
|
229
|
-
# {#
|
237
|
+
# {#execute_query}.
|
230
238
|
#
|
231
239
|
# @param [String] table The name of the table in the database to be
|
232
240
|
# read.
|
@@ -79,6 +79,7 @@ module Google
|
|
79
79
|
|
80
80
|
def initialize
|
81
81
|
@commit = Commit.new
|
82
|
+
@seqno = 0
|
82
83
|
end
|
83
84
|
|
84
85
|
##
|
@@ -157,7 +158,7 @@ module Google
|
|
157
158
|
# db = spanner.client "my-instance", "my-database"
|
158
159
|
#
|
159
160
|
# db.transaction do |tx|
|
160
|
-
# results = tx.
|
161
|
+
# results = tx.execute_query "SELECT * FROM users"
|
161
162
|
#
|
162
163
|
# results.rows.each do |row|
|
163
164
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -171,8 +172,10 @@ module Google
|
|
171
172
|
# db = spanner.client "my-instance", "my-database"
|
172
173
|
#
|
173
174
|
# db.transaction do |tx|
|
174
|
-
# results = tx.
|
175
|
-
#
|
175
|
+
# results = tx.execute_query(
|
176
|
+
# "SELECT * FROM users WHERE active = @active",
|
177
|
+
# params: { active: true }
|
178
|
+
# )
|
176
179
|
#
|
177
180
|
# results.rows.each do |row|
|
178
181
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -188,11 +191,13 @@ module Google
|
|
188
191
|
# db.transaction do |tx|
|
189
192
|
# user_hash = { id: 1, name: "Charlie", active: false }
|
190
193
|
#
|
191
|
-
# results = tx.
|
192
|
-
#
|
193
|
-
#
|
194
|
-
#
|
195
|
-
#
|
194
|
+
# results = tx.execute_query(
|
195
|
+
# "SELECT * FROM users WHERE " \
|
196
|
+
# "ID = @user_struct.id " \
|
197
|
+
# "AND name = @user_struct.name " \
|
198
|
+
# "AND active = @user_struct.active",
|
199
|
+
# params: { user_struct: user_hash }
|
200
|
+
# )
|
196
201
|
#
|
197
202
|
# results.rows.each do |row|
|
198
203
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -209,12 +214,14 @@ module Google
|
|
209
214
|
# user_type = tx.fields id: :INT64, name: :STRING, active: :BOOL
|
210
215
|
# user_hash = { id: 1, name: nil, active: false }
|
211
216
|
#
|
212
|
-
# results = tx.
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
217
|
+
# results = tx.execute_query(
|
218
|
+
# "SELECT * FROM users WHERE " \
|
219
|
+
# "ID = @user_struct.id " \
|
220
|
+
# "AND name = @user_struct.name " \
|
221
|
+
# "AND active = @user_struct.active",
|
222
|
+
# params: { user_struct: user_hash },
|
223
|
+
# types: { user_struct: user_type }
|
224
|
+
# )
|
218
225
|
#
|
219
226
|
# results.rows.each do |row|
|
220
227
|
# puts "User #{row[:id]} is #{row[:name]}"
|
@@ -231,30 +238,133 @@ module Google
|
|
231
238
|
# user_type = tx.fields id: :INT64, name: :STRING, active: :BOOL
|
232
239
|
# user_data = user_type.struct id: 1, name: nil, active: false
|
233
240
|
#
|
234
|
-
# results = tx.
|
235
|
-
#
|
236
|
-
#
|
237
|
-
#
|
238
|
-
#
|
241
|
+
# results = tx.execute_query(
|
242
|
+
# "SELECT * FROM users WHERE " \
|
243
|
+
# "ID = @user_struct.id " \
|
244
|
+
# "AND name = @user_struct.name " \
|
245
|
+
# "AND active = @user_struct.active",
|
246
|
+
# params: { user_struct: user_data }
|
247
|
+
# )
|
239
248
|
#
|
240
249
|
# results.rows.each do |row|
|
241
250
|
# puts "User #{row[:id]} is #{row[:name]}"
|
242
251
|
# end
|
243
252
|
# end
|
244
253
|
#
|
245
|
-
def
|
254
|
+
def execute_query sql, params: nil, types: nil
|
246
255
|
ensure_session!
|
247
256
|
|
257
|
+
@seqno += 1
|
258
|
+
|
248
259
|
params, types = Convert.to_input_params_and_types params, types
|
249
260
|
|
250
|
-
session.
|
251
|
-
|
261
|
+
session.execute_query sql, params: params, types: types,
|
262
|
+
transaction: tx_selector, seqno: @seqno
|
263
|
+
end
|
264
|
+
alias execute execute_query
|
265
|
+
alias query execute_query
|
266
|
+
alias execute_sql execute_query
|
267
|
+
|
268
|
+
##
|
269
|
+
# Executes a DML statement.
|
270
|
+
#
|
271
|
+
# @param [String] sql The DML statement string. See [Query
|
272
|
+
# syntax](https://cloud.google.com/spanner/docs/query-syntax).
|
273
|
+
#
|
274
|
+
# The DML statement string can contain parameter placeholders. A
|
275
|
+
# parameter placeholder consists of "@" followed by the parameter
|
276
|
+
# name. Parameter names consist of any combination of letters,
|
277
|
+
# numbers, and underscores.
|
278
|
+
# @param [Hash] params Parameters for the DML statement string. The
|
279
|
+
# parameter placeholders, minus the "@", are the the hash keys, and
|
280
|
+
# the literal values are the hash values. If the query string contains
|
281
|
+
# something like "WHERE id > @msg_id", then the params must contain
|
282
|
+
# something like `:msg_id => 1`.
|
283
|
+
#
|
284
|
+
# Ruby types are mapped to Spanner types as follows:
|
285
|
+
#
|
286
|
+
# | Spanner | Ruby | Notes |
|
287
|
+
# |-------------|----------------|---|
|
288
|
+
# | `BOOL` | `true`/`false` | |
|
289
|
+
# | `INT64` | `Integer` | |
|
290
|
+
# | `FLOAT64` | `Float` | |
|
291
|
+
# | `STRING` | `String` | |
|
292
|
+
# | `DATE` | `Date` | |
|
293
|
+
# | `TIMESTAMP` | `Time`, `DateTime` | |
|
294
|
+
# | `BYTES` | `File`, `IO`, `StringIO`, or similar | |
|
295
|
+
# | `ARRAY` | `Array` | Nested arrays are not supported. |
|
296
|
+
# | `STRUCT` | `Hash`, {Data} | |
|
297
|
+
#
|
298
|
+
# See [Data
|
299
|
+
# types](https://cloud.google.com/spanner/docs/data-definition-language#data_types).
|
300
|
+
#
|
301
|
+
# See [Data Types - Constructing a
|
302
|
+
# STRUCT](https://cloud.google.com/spanner/docs/data-types#constructing-a-struct).
|
303
|
+
# @param [Hash] types Types of the SQL parameters in `params`. It is not
|
304
|
+
# always possible for Cloud Spanner to infer the right SQL type from a
|
305
|
+
# value in `params`. In these cases, the `types` hash can be used to
|
306
|
+
# specify the exact SQL type for some or all of the SQL query
|
307
|
+
# parameters.
|
308
|
+
#
|
309
|
+
# The keys of the hash should be query string parameter placeholders,
|
310
|
+
# minus the "@". The values of the hash should be Cloud Spanner type
|
311
|
+
# codes from the following list:
|
312
|
+
#
|
313
|
+
# * `:BOOL`
|
314
|
+
# * `:BYTES`
|
315
|
+
# * `:DATE`
|
316
|
+
# * `:FLOAT64`
|
317
|
+
# * `:INT64`
|
318
|
+
# * `:STRING`
|
319
|
+
# * `:TIMESTAMP`
|
320
|
+
# * `Array` - Lists are specified by providing the type code in an
|
321
|
+
# array. For example, an array of integers are specified as
|
322
|
+
# `[:INT64]`.
|
323
|
+
# * {Fields} - Nested Structs are specified by providing a Fields
|
324
|
+
# object.
|
325
|
+
#
|
326
|
+
# @return [Integer] The exact number of rows that were modified.
|
327
|
+
#
|
328
|
+
# @example
|
329
|
+
# require "google/cloud/spanner"
|
330
|
+
#
|
331
|
+
# spanner = Google::Cloud::Spanner.new
|
332
|
+
# db = spanner.client "my-instance", "my-database"
|
333
|
+
#
|
334
|
+
# db.transaction do |tx|
|
335
|
+
# row_count = tx.execute_update(
|
336
|
+
# "UPDATE users SET name = 'Charlie' WHERE id = 1",
|
337
|
+
# )
|
338
|
+
# end
|
339
|
+
#
|
340
|
+
# @example Update using SQL parameters:
|
341
|
+
# require "google/cloud/spanner"
|
342
|
+
#
|
343
|
+
# spanner = Google::Cloud::Spanner.new
|
344
|
+
# db = spanner.client "my-instance", "my-database"
|
345
|
+
#
|
346
|
+
# db.transaction do |tx|
|
347
|
+
# row_count = tx.execute_update(
|
348
|
+
# "UPDATE users SET name = @name WHERE id = @id",
|
349
|
+
# params: { id: 1, name: "Charlie" }
|
350
|
+
# )
|
351
|
+
# end
|
352
|
+
#
|
353
|
+
def execute_update sql, params: nil, types: nil
|
354
|
+
results = execute_query sql, params: params, types: types
|
355
|
+
# Stream all PartialResultSet to get ResultSetStats
|
356
|
+
results.rows.to_a
|
357
|
+
# Raise an error if there is not a row count returned
|
358
|
+
if results.row_count.nil?
|
359
|
+
raise Google::Cloud::InvalidArgumentError,
|
360
|
+
"DML statement is invalid."
|
361
|
+
end
|
362
|
+
results.row_count
|
252
363
|
end
|
253
|
-
alias query execute
|
254
364
|
|
255
365
|
##
|
256
366
|
# Read rows from a database table, as a simple alternative to
|
257
|
-
# {#
|
367
|
+
# {#execute_query}.
|
258
368
|
#
|
259
369
|
# @param [String] table The name of the table in the database to be
|
260
370
|
# read.
|
@@ -530,7 +640,7 @@ module Google
|
|
530
640
|
# end
|
531
641
|
#
|
532
642
|
def fields_for table
|
533
|
-
|
643
|
+
execute_query("SELECT * FROM #{table} WHERE 1 = 0").fields
|
534
644
|
end
|
535
645
|
|
536
646
|
##
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-spanner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Moore
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-cloud-core
|