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.



307
308
309
310
311
312
313
314
315
# File 'lib/google/cloud/spanner/commit.rb', line 307

def delete table, keys = []
  @mutations += [
    Google::Spanner::V1::Mutation.new(
      delete: Google::Spanner::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
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/google/cloud/spanner/commit.rb', line 151

def insert table, *rows
  rows = Array(rows).flatten
  return rows if rows.empty?
  rows.delete_if(&:nil?)
  rows.delete_if(&:empty?)
  @mutations += rows.map do |row|
    Google::Spanner::V1::Mutation.new(
      insert: Google::Spanner::V1::Mutation::Write.new(
        table: table, columns: row.keys.map(&:to_s),
        values: [Convert.raw_to_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
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
# File 'lib/google/cloud/spanner/commit.rb', line 267

def replace table, *rows
  rows = Array(rows).flatten
  return rows if rows.empty?
  rows.delete_if(&:nil?)
  rows.delete_if(&:empty?)
  @mutations += rows.map do |row|
    Google::Spanner::V1::Mutation.new(
      replace: Google::Spanner::V1::Mutation::Write.new(
        table: table, columns: row.keys.map(&:to_s),
        values: [Convert.raw_to_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
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/google/cloud/spanner/commit.rb', line 208

def update table, *rows
  rows = Array(rows).flatten
  return rows if rows.empty?
  rows.delete_if(&:nil?)
  rows.delete_if(&:empty?)
  @mutations += rows.map do |row|
    Google::Spanner::V1::Mutation.new(
      update: Google::Spanner::V1::Mutation::Write.new(
        table: table, columns: row.keys.map(&:to_s),
        values: [Convert.raw_to_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
    STRING String
    DATE Date
    TIMESTAMP Time, DateTime
    BYTES File, IO, StringIO, or similar
    ARRAY Array Nested arrays are not supported.

    See Data types.



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

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