миграции в рельсах (sqlite) - PullRequest
1 голос
/ 23 февраля 2011

эй, у меня небольшая проблема с моей rake

class CreateEvents < ActiveRecord::Migration

  def self.up
    create_table :events do |t|
      t.integer :broadcast_id
      t.integer :position
      t.string :title
      t.string :location
      t.string :link
      t.text :description
      t.datetime :time
  end
    add_foreign_key :events, :broadcast_id, :broadcasts
  end

  def self.down
    remove_foreign_key :events, :broadcast_id, :broadcasts
    drop_table :events
  end

end

problem => add_foreign_key: events,: broadcast_id,: broadcasts

$ rake db: migrate

== CreateEvents: migrating ===================================================
-- create_table(:events)
-> 0.0021s
-- add_index(:events, :broadcast_id)
-> 0.0004s
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: near "FOREIGN": syntax error: ALTER TABLE "events" ADD FOREIGN KEY ("broadcast_id") REFERENCES "broadcasts"(id)

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Почему вы определяете внешние ключи таким образом?

Если вы хотите установить связь между вашими Events и Broadcasts, то вам следует заняться созданием отношения активной записи. Что-то вроде

# Event model
class Event < ActiveRecord::Base
  belongs_to :broadcast
end

# Broadcast model
class Broadcast < ActiveRecord::Base
  has_many :events
end

Таким образом, вы позволяете рельсам поддерживать отношения с внешним ключом для вас. Посмотрите Rails Guide об активных ассоциациях записей для получения дополнительной информации.

1 голос
/ 09 сентября 2014

Начиная с версии 3.6.19, SQLite, он же база данных разработки по умолчанию, поддерживает ограничения внешнего ключа, но принудительное применение ограничений внешнего ключа отключено по умолчанию (для обратной совместимости), чтобы исправить это:
Предлагаемая опция :

Используйте другую базу данных, такую ​​как mysql / postgresql, в качестве базы данных разработки в Rails, и ниже приведен пример:

default:& default
адаптер: mysql2
кодировка: utf8
пул: 5
имя пользователя: пользователь
пароль: пароль
сокет: /tmp/mysql.sock

разработка:
<<: * shared <br>база данных: db_development

Другие опции включают :

  1. Будущие версии (4. *) изВ SQLite включены ограничения внешнего ключа по умолчанию , но на данный момент он еще не выпущен.
  2. Мы также можем включить поддержку внешнего ключа с помощью следующей команды:

    sqlite> PRAGMA foreign_keys = ON;
    sqlite> PRAGMA foreign_keys // should print 1

    Но обратите внимание:

    • оно не сохраняется, и вы должны делать это при каждом подключении;
    • Если PRAGMA foreign_keys ничего не печатать, это означает, что ваша версия SQLite не поддерживает внешний ключ, пожалуйста, обновите ее до версии 3.6.19 или выше;
  3. Некоторые говорят, что мы можем включить его в строке подключения, но я не нашел правильную строку в Rails.Вы можете сослаться на этот ответ .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...