Ruby:SQLite3 :: BusyException:数据库被锁定:

ste*_*och 42 sqlite ruby-on-rails

今晚开发时遇到此错误消息: SQLite3::BusyException: database is locked:

我有两个型号:

  • 播客有许多曲目
  • 曲目属于播客.
  • 播客文件托管在mixcloud上.

要创建播客:

  • 用户在mixcloud上提交播客的网址
  • rails app抓取与url关联的json feed
  • json用于在新的Podcast对象上设置属性(标题,图像等)

我正在尝试使用我的rails应用程序来利用json feed还详细说明属于此Podcast的曲目的名称(和艺术家)这一事实.

我认为以下before_validation方法会在我们创建新的Podcast时自动创建所有关联的Tracks.

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
Run Code Online (Sandbox Code Playgroud)

我怎么能绕过这个?看起来rails(或sqlite3)不喜欢以这种方式创建关联模型的新实例.我怎么能这样做?我怀疑这是一个像sqlite3一样的rails问题.我可以发布更多代码,如果它会有所帮助.

tri*_*web 62

对于在Rails控制台打开时遇到SQLite锁定开发问题的任何其他人,请尝试以下方法:

只需运行以下命令:

ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")
Run Code Online (Sandbox Code Playgroud)

无论如何,对我来说,它似乎清除了控制台所持有的任何事务并释放了数据库.

在运行delayed_job时,这对我来说尤其是一个问题,这似乎在经常关闭事务时失败了.


mar*_*ion 22

对我来说......我遇到的问题是,我打开一段时间的Rails控制台似乎锁定了与SQLite的连接.

所以,一旦我退出该控制台,并重新启动我的网络服务器(瘦)它就完美了.

我尝试了@ trisweb的建议,但它对我不起作用.

  • 与此类似,如果您在数据库上打开SQLite数据库浏览器程序,您将遇到此问题. (4认同)

Dev*_*n M 21

SQLite实际上不应该用于并发访问,这是你在这里遇到的问题.您可以尝试增加database.yml文件中的超时,这可能是您在这种情况下的解决方法.但是,我建议您切换到另一个支持多个连接的数据库,如MySQL或PgSQL.


Tar*_*que 16

我有相同的"ActiveRecord :: StatementInvalid:SQLite3 :: BusyException:数据库被锁定:INSERT INTO"users"("created_at","email","name","password_digest","updated_at")VALUES(?,? , ?, ?, ?)" 问题.我尝试了谷歌的各种方式,但我失败了.当我关闭我的SQLite数据库浏览器时,问题就解决了.


Luk*_*uke 5

确保没有2个警卫或几个控制台在运行.如果你想确保拼命看到上面的"无名字"答案.

你也可以尝试增加游泳池:

例如:在config/database.yml中更改测试部分,如下所示

test:
    adapter: sqlite3
    database: db/test.sqlite3
    pool: 50
    timeout: 5000
Run Code Online (Sandbox Code Playgroud)


ark*_*980 5

也许您在另一个 bash 上打开了 Rails 控制台,如果是这样,您必须将其关闭(ctrl+D)。