Что означает «execute ‹< - SQL» в Rails?

Когда я имею в виду active_record_migrations в Интернете по адресу http://guides.rubyonrails.org/active_record_migrations.html

В следующем фрагменте:

class ExampleMigration < ActiveRecord::Migration[5.0]
  def up
    create_table :distributors do |t|
      t.string :zipcode
    end

    # add a CHECK constraint
    execute <<-SQL
      ALTER TABLE distributors
        ADD CONSTRAINT zipchk
        CHECK (char_length(zipcode) = 5);
    SQL

    add_column :users, :home_page_url, :string
    rename_column :users, :email, :email_address
  end

  def down
    rename_column :users, :email_address, :email
    remove_column :users, :home_page_url

    execute <<-SQL
      ALTER TABLE distributors
        DROP CONSTRAINT zipchk
    SQL

    drop_table :distributors
  end
end

что означает следующее утверждение?

execute <<-SQL
  ALTER TABLE distributors
    ADD CONSTRAINT zipchk
    CHECK (char_length(zipcode) = 5);
SQL

Выполняя эту миграцию с rails db:migrate, я получаю сообщение об ошибке:

SQLite3::SQLException: near "CONSTRAINT": syntax error:           ALTER TABLE distributors
            ADD CONSTRAINT zipchk
              CHECK (char_length(zipcode) = 5) NO INHERIT;

Дополнительные сведения см. В разделе 3.9 Использование обратимого.


person niaomingjian    schedule 03.11.2016    source источник


Ответы (2)


Он называется heredoc и не имеет ничего общего с миграциями, SQL или чем-то еще:

Если вы пишете большой блок текста, вы можете использовать «здесь документ» или «heredoc»:

expected_result = <<HEREDOC

This would contain specially formatted text.

That might span many lines
HEREDOC

Heredoc начинается со строки, следующей за «HEREDOC», и заканчивается следующей строкой, которая начинается с HEREDOC. Результат включает конечный символ новой строки.

Вы можете использовать любой идентификатор с heredoc, но обычно используются идентификаторы в верхнем регистре.

Вы можете сделать отступ для конечного идентификатора, если поставите «-» после ‹<:

  expected_result = <<-INDENTED_HEREDOC
This would contain specially formatted text.

That might span many lines
  INDENTED_HEREDOC

Обратите внимание, что хотя закрывающий идентификатор может иметь отступ, содержимое всегда обрабатывается так, как если бы оно оставалось на одном уровне. Если вы сделаете отступ для содержимого, эти пробелы появятся в выводе.

Поскольку ActiveRecord :: ConnectionAdapters :: DatabaseStatements # _3 _ принимает строку в качестве аргумента, вы передаете эту строку, просто хорошо отформатированную.

person Andrey Deineko    schedule 03.11.2016

Этот синтаксис используется для создания миграций в стиле sql, а не по пути активной записи rails.

Преимущество: он обеспечивает больший контроль над операциями SQL, добавлением индексов, ограничений и т. Д.

Синтаксис:

execute <<-EOSQL your_sql_here EOSQL

class CreateEmployers < ActiveRecord::Migration def up execute <<-EOSQL CREATE TABLE employers (id bigint (20) NOT NULL AUTO_INCREMENT, designation_id int (11) NOT NULL, salary int (11) DEFAULT NULL); EOSQL end def down выполнить ‹< - EOSQL DROP TABLE employers; EOSQL end end

person Ajay    schedule 03.11.2016
comment
Я использую sqlite в качестве базы данных. Я ошибаюсь в синтаксисе создания ограничения CHECK? - person niaomingjian; 03.11.2016
comment
heredoc не имеет ничего общего со специальным синтаксисом миграции. Он также не обеспечивает больше контроля над операциями SQL. heredoc используется для записи large block of text you. Период. - person Andrey Deineko; 03.11.2016
comment
@ Андрей Дейнеко Как мне исправить эту ошибку? Неправильный синтаксис sql? - person niaomingjian; 03.11.2016