Подтвердить что ты не робот

Ruby: SQLite3:: BusyException: база данных заблокирована:

Подключитесь к этому сообщению об ошибке во время разработки сегодня: SQLite3::BusyException: database is locked:

У меня две модели:

  • В подкастах есть много треков
  • Треки принадлежат подкастам.
  • Файлы подкастов размещаются на mixcloud.

Чтобы создать подкаст:

  • Пользователь отправляет URL-адрес подкаста на mixcloud
  • rails app захватывает json-канал, связанный с URL-адресом
  • json используется для установки атрибутов (заголовок, изображение и т.д.) в новом объекте Podcast

Я пытаюсь заставить мое приложение rails использовать тот факт, что в json feed также указаны имена (и исполнители) треков, принадлежащих этому подкасту.

Я думал, что следующий метод before_validation автоматически создаст все связанные треки, когда мы создадим новый Podcast.

class Podcast < ActiveRecord::Base
  attr_accessible :mixcloud_url, :lots, :of, :other, :attrs
  has_many :tracks    
  before_validation :create_tracks
  def create_tracks
    json = Hashie::Mash.new HTTParty.get(self.json_url)    
    json.sections.each do |section|
      if section.section_type=="track"
          Track.create(:name=>section.track.name, :podcast_id=>self.id)
      end
    end             
  end
end

Как я могу обойти это? Похоже, что рельсы (или sqlite3) мне не нравятся, создавая таким образом новые экземпляры связанной модели. Как еще я могу это сделать? Я подозреваю, что это проблема с рельсами, как sqlite3. Я могу опубликовать больше кода, если он поможет.

4b9b3361

Ответ 1

Для всех, кто сталкивается с этой проблемой при блокировке SQLite при разработке, когда консоль Rails открыта, попробуйте следующее:

Просто запустите следующее:

ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")

В любом случае, мне кажется, что он очищает любую транзакцию, на которую удерживает консоль, и освобождает базу данных.

Это особенно проблема для меня при запуске delayed_job, который, кажется, не работает при закрытии транзакции довольно часто.

Ответ 2

Для меня... проблема была в том, что казалось, что консоль Rails, которую я открывал некоторое время, блокировала соединение с SQLite.

Итак, как только я вышел из этой консоли и перезапустил свой веб-сервер (Thin), он отлично работал.

Я попробовал предложение @trisweb, но это не сработало для меня.

Ответ 3

SQLite на самом деле не должен использоваться для одновременного доступа, который является проблемой, с которой вы работаете. Вы можете попытаться увеличить таймаут в вашем файле database.yml, который может быть обходным путем для вас в этом случае. Однако я бы рекомендовал вам переключиться на другую базу данных, которая поддерживает несколько соединений, таких как MySQL или PgSQL.

Ответ 4

У меня была та же "ActiveRecord:: StatementInvalid: SQLite3:: BusyException: база данных заблокирована: INSERT INTO" пользователи "(" created_at "," email "," name "," password_digest "," updated_at ") VALUES (?,?,?,?,?). Я старался изо всех сил найти в Google, и я потерпел неудачу. Проблема была решена для меня, когда я закрыл свой SQLite Database Browser.

Ответ 5

Убедитесь, что у вас нет двух охранников или нескольких консолей. Если вы хотите, убедитесь, что отчаянно видите ответ "Нет имени" выше.

Вы также можете попробовать увеличить пул:

например: измените тестовый раздел в вашем config/database.yml, как показано ниже

test:
    adapter: sqlite3
    database: db/test.sqlite3
    pool: 50
    timeout: 5000

Ответ 6

Возможно, у вас есть консоль Rails, открытая на другом bash, если вам нужно закрыть ее (ctrl + D).

Ответ 7

на самом деле для меня, я нашел, что убивающие рельсы помогают решить эту проблему.

используйте "ps aux | grep rails", чтобы узнать текущий идентификатор процесса rails. затем используйте

"kill -9 [rails-pid]"

чтобы убить процессы.

Тогда он будет работать

Ответ 8

Скорее всего, он не связан с кодом rails. В то же время консоль с опцией песочницы (rails console --sandbox) делает проблему систематической с SQLite, так как консоль в основном ждет выхода, чтобы откатить все.

Решение выше из @trisweb не будет работать в этом случае, но выход из консоли будет.

Ответ 9

моя проблема: я открыл программу управления базами данных под названием "Браузер DB для SQlite". Закрыл эту программу управления базами данных, и проблема решена.

Ответ 10

Да, это старый вопрос, и здесь уже много ответов. Но никто из них не работал у меня, а это означало, что мне потребовалось много времени, чтобы, наконец, выяснить проблему. Я нашел, что сработало и поделится им, если это то, что может вызвать проблему для вас.

Я использовал браузер SQLITE (его браузер базы данных GUI). Я буду называть его "GUI" здесь (чтобы предотвратить путаницу со словом browser, являющимся вашим браузером localhost:: 8000 chrome или что-то еще.
http://sqlitebrowser.org/

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

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

Как выясняется, SQLite Browser фактически не удаляет строку (вызывая путаницу на моем конце относительно того, почему мое приложение действует как строка, все еще там, хотя она визуально отсутствовала на графическом интерфейсе). В любом случае после 30 минут разочарования я закрыл GUI SQLite, а затем получил уведомление о том, что я хотел сохранить любые изменения в базе данных, которую я создал. Я наивно нажал "Нет" и закрыл приложение.

По-видимому, происходит то, что графический интерфейс затем блокировал базу данных, потому что в моей базе данных были строки, которые были "мягкими", без фиксации. Таким образом, GUI был (из-за отсутствия лучшего термина), содержащего базу данных в Limbo.

Это объясняет, почему a) мое приложение не действовало так, как будто строка отсутствовала, потому что она еще не была удалена, а B) объясняет, почему база данных заблокирована вверх. Я все еще ожидал, что я удалю его.

Итак, чтобы решить проблему, я просто снова открыл графический интерфейс и удалил одну и ту же строку, а затем закрыл графический интерфейс и это время, когда я нажал "Да" при запросе сохранения изменений в базе данных, Он сохранил удаление и разблокировал базу данных, и теперь мое приложение работает!


Я надеюсь, что это поможет кому-то другому, у которого может быть такая же проблема, но он использует интерфейс GUI SQLite Browser. Возможно, это то, что блокирует вашу базу данных.

Ответ 11

У меня была такая же проблема. Для тех, у кого есть SQLite Database Browser. Мне не нужно было закрывать SQLite Database Browser. Мне просто нужно было нажать кнопку "Write Changes". Он подсвечивается и не должен быть выделен.

Ответ 12

SQLite имеет проблемы с concurrency. Я изменил sqlite на Postgresql, и проблема исчезла.

Ответ 13

Это происходит, когда вы вносите какие-либо изменения вручную непосредственно в SQlite DB Browser (например, удаляете строку или изменяете значение любого столбца) и забываете сохранять эти изменения. Любые сделанные изменения необходимо сохранить (ctrl + s). Если не сохранить, SQLite блокирует базу данных до тех пор, пока вы не сохраните эти изменения.

Я сделал то же самое, и моя проблема была решена!

Ответ 14

Я использовал DB Browser для SQLite и консоль rails одновременно. Закрытие DB Browser for SQLite исправило проблему для меня.

Ответ 15

попробуйте перезапустить сервер или закрытие любой бегущей консоли рельсов, работал на меня

Ответ 16

Ваш файл .sqlite3 должен быть сохранен. Перейдите в браузер БД для SQlite и выполните ctrl + s или File-> Записать изменения.