Class: Google::Cloud::Spanner::Commit

Inherits:
Object
  • Object
show all
Defined in:
lib/google/cloud/spanner/commit.rb

Overview

Commit

Accepts mutations for execution within a transaction. All writes will execute atomically at a single logical point in time across columns, rows, and tables in a database.

All changes are accumulated in memory until the block passed to Google::Cloud::Spanner::Client#commit completes.

Examples:

require "google/cloud/spanner"

spanner = Google::Cloud::Spanner.new

db = spanner.client "my-instance", "my-database"

db.commit do |c|
  c.update "users", [{ id: 1, name: "Charlie", active: false }]
  c.insert "users", [{ id: 2, name: "Harvey",  active: true }]
end

Instance Method Summary collapse

Instance Method Details

#delete(table, keys = []) ⇒ Object

Deletes rows from a table. Succeeds whether or not the specified rows were present.

All changes are accumulated in memory until the block passed to Google::Cloud::Spanner::Client#commit completes.

Examples:

require "google/cloud/spanner"

spanner = Google::Cloud::Spanner.new

db = spanner.client "my-instance", "my-database"

db.commit do |c|
  c.delete "users", [1, 2, 3]
end

Parameters:

  • table (String)

    The name of the table in the database to be modified.

  • keys (Object, Array<Object>) (defaults to: [])

    A single, or list of keys or key ranges to match returned data to. Values should have exactly as many elements as there are columns in the primary key.



315
316
317
318
319
320
321
322
323
324
# File 'lib/google/cloud/spanner/commit.rb', line 315

def delete table, keys = []
  @mutations += [
    V1::Mutation.new(
      delete: V1::Mutation::Delete.new(
        table: table, key_set: key_set(keys)
      )
    )
  ]
  keys
end

#insert(table, *rows) ⇒ Object

Inserts new rows in a table. If any of the rows already exist, the write or request fails with error AlreadyExistsError.

All changes are accumulated in memory until the block passed to Google::Cloud::Spanner::Client#commit completes.

Examples:

require "google/cloud/spanner"

spanner = Google::Cloud::Spanner.new

db = spanner.client "my-instance", "my-database"

db.commit do |c|
  c.insert "users", [{ id: 1, name: "Charlie", active: false },
                     { id: 2, name: "Harvey",  active: true }]
end

Parameters:

  • table (String)

    The name of the table in the database to be modified.

  • rows (Array<Hash>)

    One or more hash objects with the hash keys matching the table's columns, and the hash values matching the table's values.

    Ruby types are mapped to Spanner types as follows:

    Spanner Ruby Notes
    BOOL true/false
    INT64 Integer
    FLOAT64 Float
    FLOAT32 Float
    NUMERIC BigDecimal
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/google/cloud/spanner/commit.rb', line 155

def insert table, *rows
  rows = Array(rows).flatten
  return rows if rows.empty?
  rows.compact
  rows.delete_if(&:empty?)
  @mutations += rows.map do |row|
    V1::Mutation.new(
      insert: V1::Mutation::Write.new(
        table: table, columns: row.keys.map(&:to_s),
        values: [Convert.object_to_grpc_value(row.values).list_value]
      )
    )
  end
  rows
end

#replace(table, *rows) ⇒ Object

Inserts or replaces rows in a table. If any of the rows already exist, it is deleted, and the column values provided are inserted instead. Unlike #upsert, this means any values not explicitly written become NULL.

All changes are accumulated in memory until the block passed to Google::Cloud::Spanner::Client#commit completes.

Examples:

require "google/cloud/spanner"

spanner = Google::Cloud::Spanner.new

db = spanner.client "my-instance", "my-database"

db.commit do |c|
  c.replace "users", [{ id: 1, name: "Charlie", active: false },
                     { id: 2, name: "Harvey",  active: true }]
end

Parameters:

  • table (String)

    The name of the table in the database to be modified.

  • rows (Array<Hash>)

    One or more hash objects with the hash keys matching the table's columns, and the hash values matching the table's values.

    Ruby types are mapped to Spanner types as follows:

    Spanner Ruby Notes
    BOOL true/false
    INT64 Integer
    FLOAT64 Float
    FLOAT32 Float
    NUMERIC BigDecimal
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/google/cloud/spanner/commit.rb', line 275

def replace table, *rows
  rows = Array(rows).flatten
  return rows if rows.empty?
  rows.compact
  rows.delete_if(&:empty?)
  @mutations += rows.map do |row|
    V1::Mutation.new(
      replace: V1::Mutation::Write.new(
        table: table, columns: row.keys.map(&:to_s),
        values: [Convert.object_to_grpc_value(row.values).list_value]
      )
    )
  end
  rows
end

#update(table, *rows) ⇒ Object

Updates existing rows in a table. If any of the rows does not already exist, the request fails with error NotFoundError.

All changes are accumulated in memory until the block passed to Google::Cloud::Spanner::Client#commit completes.

Examples:

require "google/cloud/spanner"

spanner = Google::Cloud::Spanner.new

db = spanner.client "my-instance", "my-database"

db.commit do |c|
  c.update "users", [{ id: 1, name: "Charlie", active: false },
                     { id: 2, name: "Harvey",  active: true }]
end

Parameters:

  • table (String)

    The name of the table in the database to be modified.

  • rows (Array<Hash>)

    One or more hash objects with the hash keys matching the table's columns, and the hash values matching the table's values.

    Ruby types are mapped to Spanner types as follows:

    Spanner Ruby Notes
    BOOL true/false
    INT64 Integer
    FLOAT64 Float
    FLOAT32 Float
    NUMERIC BigDecimal
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/google/cloud/spanner/commit.rb', line 214

def update table, *rows
  rows = Array(rows).flatten
  return rows if rows.empty?
  rows.compact
  rows.delete_if(&:empty?)
  @mutations += rows.map do |row|
    V1::Mutation.new(
      update: V1::Mutation::Write.new(
        table: table, columns: row.keys.map(&:to_s),
        values: [Convert.object_to_grpc_value(row.values).list_value]
      )
    )
  end
  rows
end

#upsert(table, *rows) ⇒ Object Also known as: save

Inserts or updates rows in a table. If any of the rows already exist, then its column values are overwritten with the ones provided. Any column values not explicitly written are preserved.

All changes are accumulated in memory until the block passed to Google::Cloud::Spanner::Client#commit completes.

Examples:

require "google/cloud/spanner"

spanner = Google::Cloud::Spanner.new

db = spanner.client "my-instance", "my-database"

db.commit do |c|
  c.upsert "users", [{ id: 1, name: "Charlie", active: false },
                     { id: 2, name: "Harvey",  active: true }]
end

Parameters:

  • table (String)

    The name of the table in the database to be modified.

  • rows (Array<Hash>)

    One or more hash objects with the hash keys matching the table's columns, and the hash values matching the table's values.

    Ruby types are mapped to Spanner types as follows:

    Spanner Ruby Notes
    BOOL true/false
    INT64 Integer
    FLOAT64 Float
    FLOAT32 Float
    NUMERIC BigDecimal
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/google/cloud/spanner/commit.rb', line 95

def upsert table, *rows
  rows = Array(rows).flatten
  return rows if rows.empty?
  rows.compact
  rows.delete_if(&:empty?)
  @mutations += rows.map do |row|
    V1::Mutation.new(
      insert_or_update: V1::Mutation::Write.new(
        table: table, columns: row.keys.map(&:to_s),
        values: [Convert.object_to_grpc_value(row.values).list_value]
      )
    )
  end
  rows
end