我在使用Postgresql和Rails 3进行测试时遇到了问题。
开发和生产数据库我都可以正常工作,但是当我运行rake
或db:test:prepare
等时,测试数据库会抛出以下错误。
PGError:错误:其他用户正在访问源数据库“template1”
在使用createdb在Postgres中创建新数据库时,似乎应该使用template0
而不是template1
。在典型的“所以我将删除原因。但不是症状“时尚,我发现vendor/rails/railities/lib/task/databases.rake
并改变了第109行:
createdb #{enc_option} \
-U "#{abcs["test"]["username"]}" \
-T template0 #{abcs["test"]["database"]}
但我真的不想这样做,因为我使用Rails作为创业板,任何人都知道另一种解决方法或修复?
的database.yml :
development:
adapter: postgresql
encoding: unicode
database: test1234_development
pool: 5
username: holden
password: postgres
test:
adapter: postgresql
encoding: unicode
database: test1234_test
pool: 5
username: holden
password: postgres
完整错误:
注意:数据库“test1234_test”不存在,跳过
PGError:错误:其他用户正在访问源数据库“template1” 详情:使用该数据库还有1个其他会话 :CREATE DATABASE“test1234_test”ENCODING ='unicode'
答案 0 :(得分:15)
短篇小说:CREATE DATABASE
通过复制现有数据库来工作。如果另一个会话连接到它,PostgreSQL将不允许您复制数据库。如果其他用户正在访问template1,CREATE DATABASE
将失败。
您需要回答的问题:为什么其他会话连接到template1?
template0和template1之间的区别
在初始化数据库集群时,template0和template1是相同的。您希望使用CREATE DATABASE
创建的每个数据库可以使用的任何特定于位置的内容都应该进入template1。因此,例如,如果将程序语言PL / python添加到template1,则稍后创建的每个数据库都将包含PL / python。
数据库template0旨在成为“原始”模板。它应该只包含标准数据库对象 - 通过初始化集群创建的对象。作为“处女”模板,它永远不应该被改变。从不。
如果需要指定编码和区域设置(排序规则),则可以通过复制template0来实现。你不能通过复制template1来做到这一点。
答案 1 :(得分:2)
只需重新启动数据库服务。
答案 2 :(得分:1)
当您在template1和template0数据库中记录( psql template1 或 psql template0 )并使用以下命令退出时,会出现此问题。
Ctrl + z
从postgres命令下面的db使用更好的方法然后问题不会创建:
\ q +输入
有两个解决方案,如果有问题。
解决方案 - 1
重新启动posgres服务,例如。
sudo service postgresql restart
解决方案 - 2
sudo ps aux | grep template1
确保不要删除此流程
postgres 8363 0.0 0.0 111760 7832 pts / 11 T 09:49 0:00 /usr/lib/postgresql/9.5/bin/psql template1 ankit 18119 0.0 0.0 14224 976 pts / 14 S + 12:33 0:00 grep --color = auto template1
应使用以下命令杀死其余进程。
sudo kill -9
现在尝试再次创建数据库。
希望这对你有所帮助。
Ankit H Gandhi。
答案 3 :(得分:0)
当我在运行默认的Ruby on Rails服务器WEBrick时尝试重置数据库时,我也遇到了这个错误:
$ bin/rake db:reset
PG::Error: ERROR: database "dev" is being accessed by other users
DETAIL: There is 1 other session using the database.
: DROP DATABASE IF EXISTS "dev"
此处的其他用户是正在运行的Rails应用。 使用 CTRL + c 关闭服务器后,我能够毫无问题地重新运行数据库重置命令。< /强>
这也很有道理。如果其他人当前与其连接,则您无法删除数据库,如Mike Sherrill also points out。
答案 4 :(得分:0)
我重启了系统,错误仍在显示。但是,我按照以下步骤对其进行了整理。
通过在命令提示符(Admin)中执行此操作,使用postgres端口5432停止所有进程:在命令提示符下键入<Style TargetType="Image" x:Key="Blank">
<Setter Property="Source" Value="/images/blank.png"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
<Style TargetType="Image" x:Key="BlockArrowLeft">
<Setter Property="Source" Value="/images/block_arrow_left.png"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
。找到本地地址为netstat -ano
的pid。然后使用0.0.0.0:5432
来终止任务。
在Windows服务中启动postgres服务。
答案 5 :(得分:0)
对我来说,解决方案是从Postgresql管理Web界面中删除旧服务器并创建一个新服务器。现在可以创建新数据库而不会出现此错误。
答案 6 :(得分:0)
我也被困在 ruby on rails 项目上设置 postgres,确保您已经在本地安装了 pg
并使用其密码创建了一个用户,然后在您的 database.yml
上应该有:-主机:localhost,密码:(设置密码)然后运行:
$ rails db:create
$ rails db:migrate