PGError:错误:其他用户正在访问源数据库"template1"

hol*_*den 13 testing postgresql unit-testing ruby-on-rails ruby-on-rails-3

我在测试使用Postgresql和Rails 3时遇到了问题.

开发和生产数据库,我可以很好地工作,但是当我运行测试数据库引发以下错误rakedb:test:prepare

PGError:错误:其他用户正在访问源数据库"template1"

更新

谷歌搜索,似乎应该使用template0而不是template1使用createdb在Postgres中创建一个新的数据库.在典型的"所以我将删除原因.但不是症状"时尚,我发现vendor/rails/railities/lib/task/databases.rake并改变了第109行:

createdb #{enc_option} \
-U "#{abcs["test"]["username"]}" \
-T template0 #{abcs["test"]["database"]}
Run Code Online (Sandbox Code Playgroud)

但我真的不想这样做,因为我使用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
Run Code Online (Sandbox Code Playgroud)

完整错误:

注意:数据库"test1234_test"不存在,跳过
PGError:错误:其他用户正在访问源数据库"template1"
详细信息:还有1个其他会话正在使用该数据库.
:CREATE DATABASE"test1234_test"ENCODING ='unicode'

Mik*_*ll' 16

短篇小说:CREATE DATABASE通过复制现有数据库来工作.如果另一个会话连接到它,PostgreSQL将不允许您复制数据库.如果其他用户正在访问template1,CREATE DATABASE则会失败.

您需要回答的问题:为什么其他会话连接到template1?

template0和template1之间的区别

在初始化数据库集群时,template0和template1是相同的.您希望通过使用创建的每个数据库可以使用的任何特定于位置的内容都CREATE DATABASE应该进入template1.因此,例如,如果将过程语言PL/python添加到template1,则稍后创建的每个数据库都将包含PL/python.

数据库模板0旨在成为"原始"模板.它应该只包含标准数据库对象 - 通过初始化集群创建的对象.作为"处女"模板,它永远不应该被改变.决不.

如果需要指定编码和语言环境设置(排序规则),则可以通过复制template0来实现.你不能通过复制template1来做到这一点.

  • 啊......我在尝试运行测试时打开了navicat.关闭它使数据库创建成功.谢谢 (6认同)