googleapis / ruby-spanner-activerecord

Spanner<->ActiveRecord adapter for Ruby
MIT License
88 stars 32 forks source link

ActiveRecord Cloud Spanner Adapter

Google Cloud Spanner adapter for ActiveRecord.

rubocop

This adapter only supports GoogleSQL-dialect Cloud Spanner databases. PostgreSQL-dialect databases are not supported. You can use the standard PostgreSQL ActiveRecord adapter in combination with PGAdapter for Cloud Spanner PostgreSQL-dialect databases.

This project provides a Cloud Spanner adapter for ActiveRecord. It supports the following versions:

Known limitations are listed in the Limitations section. Please report any problems that you might encounter by creating a new issue.

Installation

Add this line to your application's Gemfile:

gem 'activerecord-spanner-adapter'

If you would like to use latest adapter version from github then specify

gem 'activerecord-spanner-adapter', :git => 'git@github.com:googleapis/ruby-spanner-activerecord.git'

And then execute:

$ bundle

Usage

Migrations

Use DDL batching when executing migrations for the best possible performance.

Executing multiple schema changes on Cloud Spanner can take a long time. It is therefore strongly recommended that you limit the number of schema change operations. You can do this by using DDL batching in your migrations. See the migrations examples for how to do this.

Database Connection

In Rails application config/database.yml, make the change as the following:

development:
  adapter: "spanner"
  project: "<google project name>"
  instance: "<google instance name>"
  credentials: "<google credentails file path>"
  database: "app-dev"

Examples

To get started with Rails, read the tutorial under examples/rails/README.md.

You can also find a list of short self-contained code examples that show how to use ActiveRecord with Cloud Spanner under the directory examples/snippets. Each example is directly runnable without the need to setup a Cloud Spanner database, as all samples will automatically start a Cloud Spanner emulator in a Docker container and execute the sample code against that emulator. All samples can be executed by navigating to the sample directory on your local machine and then executing the command bundle exec rake run. Example:

cd ruby-spanner-activerecord/examples/snippets/quickstart
bundle exec rake run

NOTE: You do need to have Docker installed on your local system to run these examples.

Some noteworthy examples in the snippets directory:

Limitations

Limitation Comment Resolution
Interleaved tables require composite primary keys Cloud Spanner requires composite primary keys for interleaved tables. See this example for an example on how to use interleaved tables with ActiveRecord Use composite primary keys.
Lack of sequential IDs Cloud Spanner uses either using bit-reversed sequences or UUID4 to generated primary keys to avoid hotspotting so you SHOULD NOT rely on IDs being sorted Use either UUID4s or bit-reversed sequences to automatically generate primary keys.
Table without Primary Key Cloud Spanner support does not support tables without a primary key. Always define a primary key for your table.
Table names CANNOT have spaces within them whether back-ticked or not Cloud Spanner DOES NOT support tables with spaces in them for example Entity ID Ensure that your table names don't contain spaces.
Table names CANNOT have punctuation marks and MUST contain valid UTF-8 Cloud Spanner DOES NOT support punctuation marks e.g. periods ".", question marks "?" in table names Ensure that your table names don't contain punctuation marks.
Index with fields length add_index Cloud Spanner does not support index with fields length Ensure that your database definition does not include index definitions with field lengths.
Only GoogleSQL-dialect databases Cloud Spanner supports both GoogleSQL- and PostgreSQL-dialect databases. This adapter only supports GoogleSQL-dialect databases. Ensure that your database uses the GoogleSQL dialect.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/googleapis/ruby-spanner-activerecord. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Activerecord::Spanner project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.