Top Banner
Database schema management Vsevolod Romashov Qlean 7even
24

Database schema management in Ruby apps

Apr 11, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Database schema management in Ruby apps

Database schema management

Vsevolod Romashov Qlean

7even

Page 2: Database schema management in Ruby apps

Migrations

• bin/rails generate migration AddPartNumberToProducts

• bundle exec hanami generate migration create_books

Page 3: Database schema management in Ruby apps
Page 4: Database schema management in Ruby apps
Page 5: Database schema management in Ruby apps
Page 6: Database schema management in Ruby apps
Page 7: Database schema management in Ruby apps

class ChangeDifferentThingsInUsers < ActiveRecord!::Migration def up remove_column :users, :phone change_column_null :users, :email, false add_foreign_key :posts, :users, column: :author_id end

def down remove_foreign_key :posts, column: :author_id change_column_null :users, :email, true add_column :users, :phone, null: false end end

Page 8: Database schema management in Ruby apps

DbSchemahttps://github.com/7even/db_schema

Page 9: Database schema management in Ruby apps

# db/schema.rb DbSchema.describe do |db| db.table :users do |t| t.primary_key :id t.varchar :first_name, null: false t.varchar :last_name t.timestamptz :created_at, default: :'now()' end

db.table :posts do |t| t.primary_key :id t.varchar :title, null: false t.integer :user_id, references: :users

t.index :user_id end end

Page 10: Database schema management in Ruby apps

# lib/db_schema.rb DbSchema.configure( adapter: 'postgresql', host: ENV['db_host'], port: ENV['db_port'], database: ENV['db_name'], user: ENV['db_user'], password: ENV['db_password'] )

load 'db/schema.rb'

Page 11: Database schema management in Ruby apps

Columns• All built-in data types (including extensions) +

custom enum types

• NOT NULL

• Default values (strings, numbers, Date, Time, SQL expressions)

• Type-specific attributes

Page 12: Database schema management in Ruby apps

Indexes• "Common" indexes

• Unique indexes

• Multiple indexes

• Partial indexes

• Expression indexes

• GIN, GiST etc.

• Ordered indexes

Page 13: Database schema management in Ruby apps

Foreign Keys

• Single-column

• Multi-column

• ON DELETE

• ON UPDATE

Page 14: Database schema management in Ruby apps

• Check constraints

• Enum types

• Extensions

Page 15: Database schema management in Ruby apps

DSL ReaderChanges

Runner

Page 16: Database schema management in Ruby apps

Desiredschema

Actualschema Operation

✅ ❌ Create

❌ ✅ Drop

✅ ✅ Change (?)

Page 17: Database schema management in Ruby apps

Create Drop Change

Table ✅ ✅ ✅

Primary Key ✅ ✅

Column ✅ ✅ ✅

Index ✅ ✅ ❗

Foreign Key ✅ ✅ ❗

Check Constraint ✅ ✅ ❗

Page 18: Database schema management in Ruby apps

Change Type ✅

Allow Null ✅

Disallow Null ✅

Change Column Default ✅

Make Column a Primary Key ❌

Drop Primary Key Constraint ❌

Change Column

Page 19: Database schema management in Ruby apps

Create Drop Change

Enum ✅ ✅ ❗

Extension ✅ ✅

Page 20: Database schema management in Ruby apps

Change Enum

Add New Value ✅

Drop Existing Value ❌

Reorder Values ❌

Page 21: Database schema management in Ruby apps

Problems

• Renaming tables & columns

• Some datatype changes

• Adding a NOT NULL column pre-filled with data

• Data migrations

Page 22: Database schema management in Ruby apps

db.migrate do |migration| migration.apply_if do |schema| schema.table(:users).has_field?(:first_name) end

migration.run do |migrator| migrator.create_column :users, :name, :varchar

User.find_each do |user| name = [user.first_name, user.last_name].compact.join(' ') user.update(name: name) end

migrator.drop_column :users, :first_name migrator.drop_column :users, :last_name

migrator.disallow_null :users, :name end end

Page 23: Database schema management in Ruby apps

Roadmap• full-fledged primary keys support

• MySQL/SQLite support

• schema dumper

• model annotations

Page 24: Database schema management in Ruby apps

Questions?