我正在阅读Michael Hartl撰写的Ruby on Rails教程,在第6章中,我被指示创建一个新的迁移,以在users表的email列中添加索引。
这是我的迁移:
def self.up
add_index :users, :email, :unique => true
end
def self.down
remove_index :users, :email
end
当我运行rake db:migrate时,它认为是一秒钟,然后抛出一个BusyException并说数据库被锁定。数据库是存储在我的用户文件夹中的本地计算机上的sqlite3数据库;没什么特别的。
非常感谢任何和所有帮助。
答案 0 :(得分:7)
我总是得到这个,这是因为sqlite一次只能被一个进程访问,并且数据库被该进程锁定。确保没有其他终端中运行的服务器或控制台。如果你继续得到这个,并且你确定没有其他东西可以访问那个sqlite数据库(包括僵尸进程),你可以按照这里的建议:
答案 1 :(得分:2)
几乎和我一样。 简单的解决方案是从我的rails控制台退出。它锁定了SQLite。
答案 2 :(得分:2)
我遇到了同样的问题。对我来说,我打开了SQLite数据库浏览器,并使用锁定它的相同数据库。
答案 3 :(得分:1)
/同意克里斯托弗
对于我们这些基于unix的机器,一个简单的
$: ps -a | grep ruby
$: kill -s 9 XXXX
从我怀疑是罪魁祸首的终端的红宝石过程中为我做了这件事。它总是由一个控制台或服务器引起的,它以一种让我杀死它的方式挂起,然后必须找到解锁数据库的“僵尸”进程。
在Windows上,肯定不会比杀死一个可疑的进程树更难。
答案 4 :(得分:0)
我的BusyException
问题的解决方案,“回想起来很明显”,就是我没有对SQLite3
数据库的写访问权。我有一个git克隆了一个rails项目到一个Windows服务的文件系统,我从Ubuntu盒子访问。无论出于何种原因,Sqlite3
数据库都是使用+ x权限创建的,Sqlite3
必须将其解释为忙碌。
只有经过大量工作确认版本,宝石,红宝石等后,才注意到文件权限为+ x。
当然,这是一个神秘的环境,但我在开启/关闭这个问题两个星期的努力,没有找到任何搜索谷歌的帮助,我认为我会为知识库添加解决方案。
答案 5 :(得分:0)
对我来说,没有什么工作。我删除了所有* .sqlite3文件,然后运行
rake db:create
rake db:migrate
然后它奏效了。
PS:sqlite3文件位于rails项目根目录的db文件夹中
答案 6 :(得分:0)
刚刚遇到了同样的问题,但解决方案与上述略有不同。
$ pgrep -l rails
XXXX ruby
$ kill -s 9 XXXX