Как установить соединение с реляционной базой данных?ruby-95

Ruby предлагает несколько способов подключения к реляционным СУБД. Рассмотрим основные подходы и лучшие практики.

1. Использование чистого Ruby с драйверами баз данных

Подключение к PostgreSQL

require 'pg'

begin
  conn = PG.connect(
    dbname: 'myapp_production',
    user: 'app_user',
    password: ENV['DB_PASSWORD'],
    host: 'localhost',
    port: 5432
  )

  # Выполнение запроса
  result = conn.exec('SELECT * FROM users LIMIT 5')
  result.each do |row|
    puts row['email']
  end
rescue PG::Error => e
  puts "Ошибка подключения: #{e.message}"
ensure
  conn&.close
end

Подключение к MySQL

require 'mysql2'

client = Mysql2::Client.new(
  host: 'localhost',
  username: 'root',
  password: ENV['DB_PASSWORD'],
  database: 'myapp_development',
  reconnect: true # Автоматическое переподключение
)

results = client.query('SELECT * FROM products')

2. Использование ActiveRecord без Rails

Базовое подключение

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  'postgresql',
  host:     'localhost',
  database: 'myapp_dev',
  username: 'dev_user',
  password: 'password',
  pool:     5,
  timeout:  5000
)

class User < ActiveRecord::Base
end

User.all.each { |user| puts user.name }

3. Использование ConnectionPool для многопоточности

require 'connection_pool'
require 'pg'

# Создаем пул из 5 соединений
DB_POOL = ConnectionPool.new(size: 5) do
  PG.connect(dbname: 'myapp')
end

# Использование в потоке
DB_POOL.with do |conn|
  conn.exec('UPDATE counters SET value = value + 1')
end

4. Конфигурация через URL

Подключение через DSN строку

# PostgreSQL
ActiveRecord::Base.establish_connection(
  'postgresql://user:password@localhost:5432/dbname?pool=5'
)

# MySQL
client = Mysql2::Client.new(
  'mysql2://root:password@127.0.0.1:3306/dbname?reconnect=true'
)

5. Использование YAML для конфигурации

config/database.yml

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: dev_user
  password: <%= ENV['DB_PASSWORD'] %>
  host: localhost

Загрузка конфигурации

require 'yaml'
db_config = YAML.load_file('config/database.yml')[ENV['RACK_ENV'] || 'development']
ActiveRecord::Base.establish_connection(db_config)

6. Лучшие практики подключения

  1. Не храните пароли в коде - используйте переменные окружения
  2. Ограничивайте размер пула соединений согласно ресурсам сервера
  3. Обрабатывайте ошибки подключения с retry логикой
  4. Используйте TLS/SSL для защищенного подключения
  5. Закрывайте соединения в ensure-блоках

Пример с retry логикой

def with_db_connection(retries: 3)
  attempts = 0
  begin
    yield
  rescue PG::ConnectionBad, Mysql2::Error => e
    attempts += 1
    if attempts <= retries
      sleep(2**attempts) # Exponential backoff
      retry
    end
    raise "DB connection failed after #{retries} attempts: #{e.message}"
  end
end

with_db_connection do
  User.where(active: true).count
end

7. Проверка соединения

Ping-запрос к базе

# Для PostgreSQL
conn.exec('SELECT 1')

# Для ActiveRecord
ActiveRecord::Base.connection.execute('SELECT 1')

Проверка через migration

begin
  ActiveRecord::Base.connection.migration_context.current_version
  true
rescue
  false
end

8. Подключение к разным базам в одном приложении

class PrimaryDB < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(:primary)
end

class ReplicaDB < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(:replica)
end

class User < PrimaryDB; end
class ReadonlyUser < ReplicaDB; end

Резюмируем

Для подключения к реляционным БД в Ruby доступны:

  1. Низкоуровневые драйверы (pg, mysql2) - для полного контроля
  2. ActiveRecord - удобный ORM для работы с данными
  3. ConnectionPool - для эффективного управления соединениями
  4. YAML-конфиги - для удобного управления настройками

Основные рекомендации:

  • Всегда используйте пул соединений
  • Храните секреты в переменных окружения
  • Реализуйте механизмы retry для обработки временных сбоев
  • Для production используйте реплики для чтения
  • Мониторьте количество активных соединений

Для сложных сценариев рассмотрите:

  • Использование Sequel как альтернативу ActiveRecord
  • Применение read/write splitting
  • Использование ProxySQL для балансировки нагрузки