사용하지 않고 사용하지 않습니까? Rails에서 Temporary Table을 사용하는 방법

7353 단어 MySQLRailssqlite

소개



DMM WEBCAMP Advent Calendar 2020 12 일째 담당을하겠습니다!
DMM WEBCAMP 멘토의 Sawa입니다!

앱 개발에서 데이터베이스에서 여러 테이블을 사용할 때
「이 페이지만 1개의 테이블에 정리하고 싶어...」
그런 생각을 한 적이 없습니까?

그래서 이번에는
사용하지 않고 사용하지 않지만 알아두면 손해가 없습니다.
"Temporary Table"
에 대해 정리하겠습니다

Temporary Table이란?



Rails를 사용한 웹 앱에서는 일반적으로 데이터베이스(SQLite, MySQL 등)에 데이터를 저장합니다.
기본적으로는 미리 테이블을 작성해 두고, 거기에 데이터를 신규 작성, 갱신해 갑니다.
반면에 데이터베이스에는 일시적으로 테이블을 만들고 필요한 경우에만 테이블을 사용할 수있는 기능이 있습니다.
그 기능이야말로 이번에 소개하는 「Temporary Table」입니다!

Rails에서 사용해보기



Rails에서 데이터베이스를 사용할 때 ActiveRecord를 사용합니다.
ActiveRecord에 대해서는 여기의 기사가 알기 쉬웠기 때문에 참고로 되면 좋을까 생각합니다.

또한 Rails5 계에서는 ActiveRecord::Base를 계승한 ApplicationRecord를 사용할 수 있기 때문에 본 기사에서는 ApplicationRecord를 사용합니다.

ApplicationRecord를 사용하여 Temporary Table 만들기



이번에는 이벤트 테이블을 Temporary Table로 작성하기로 결정합니다.
컬럼으로서 title, body 컬럼을 준비해 보았습니다.

temporary_tables_controller.rb
ApplicationRecord.connection.create_table('events', temporary: true, force: true) do |t|
    t.string :title
    t.text   :body
    t.timestamps
end

첫 번째 줄에서는 ApplicationRecord를 호출하고 데이터베이스에 연결하여 테이블을 만듭니다.
SQLite, MySQL에서는 temporary: true로하는 것만으로 temporary table를 만들 수 있습니다
(MySQL의 경우 기본적으로 temporary table의 사용 권한이 없습니다. MySQL에 로그인하고 권한 변경이 필요합니다.)

옵션으로 force: true 를 사용하고 있습니다만, 이것은 기존의 테이블이 있을 때에 한 번 삭제를 해 재작성하는 것을 의미하고 있으므로 잊지 마세요.

다음에 작성한 Temporary Table을 ApplicationRecored에 연결해 갑니다.
(이미지로는 모델을 만드는 느낌입니다)

temporary_tables_controller.rb
Object.const_set('Event', Class.new(ApplicationRecord))

Object.const_set은 동적으로 클래스를 생성할 수 있는 메서드이며 ApplicationRecord를 상속한 Event 클래스를 만듭니다.
이것은

terminal
$ rails g model Event

event.rb
class Event < ApplicationRecord
end

동적으로 처리하는 것과 비슷한 의미를 갖습니다.

이상의 공정으로 Temporary Table를 Rails로 사용할 수 있게 됩니다!

실제로 사용해보기



이제 Rails에서 Temporary Table을 사용해 봅시다!
이번에는 다음과 같은 코드를 짜 보았습니다.
Temporary Table을 만들어 거기에 새로운 데이터를 넣습니다.

실행 환경 : Rails 5.2, SQLite3

temporary_tables_controller.rb
def event
    ApplicationRecord.connection.create_table('events', temporary: true, force: true) do |t|
        t.string :title
        t.text   :body
        t.timestamps
    end

    Object.const_set('Event', Class.new(ApplicationRecord))

    @events = Event.create([
        {title: "hoge-1", body: "fuga-1"},
        {title: "hoge-2", body: "fuga-2"},
        {title: "hoge-3", body: "fuga-3"}
        ])
end

event.html.erb
<% @events.each do |event| %>
    <%= event.title %>
    <%= event.body %><br>
<% end %>

동작 확인을 해 보면 다음과 같이 표시되었습니다. 제대로 Temporary Table이 만들어져 데이터가 저장되어 있습니다!

터미널:

화면 표시:


사이고에게



오늘은 Temporary Table에 대해 정리해 보았습니다! 어땠습니까?

이전 simple calendar을 사용하여 앱을 개발했으며 캘린더에 일정을 넣기 위해 모델을 하나로 만들어야했습니다 ...
그 때에 이 Tempolary Table가 대활약을 한 것입니다!

알아두면 어딘가에서 도움이 될 수 있습니다

좋은 웹페이지 즐겨찾기