我在RDS上使用Postgres创建了一个新的EC2实例。我确认我可以使用psql从EC2实例连接到数据库,没有任何问题,这意味着我的安全设置没问题。
然而,当我尝试运行manage.py runserver
或manage.py dbshell
(来自virtualenv)时,Django会挂起,然后最终会出现超时错误:
psql:无法连接到服务器:连接超时是服务器 在主机上运行" whatever.rds.amazonaws.com" (172.xxx.xxx.xxx)并接受端口5342上的TCP / IP连接?
回溯(最近一次呼叫最后一次):文件" manage.py",第22行,in execute_from_command_line(sys.argv)File" /home/ubuntu/Env/xxxx/lib/python3.5/site-packages/django/core/management/ init .py", 第363行,在execute_from_command_line中 utility.execute()
文件" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/ init .py", 第355行,执行中 self.fetch_command(子命令).run_from_argv(self.argv)
File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/base.py", 第283行,在run_from_argv中 self.execute(* args,** cmd_options)
File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/base.py", 第330行,执行中 output = self.handle(* args,** options)
文件" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/core/management/commands/dbshell.py", 第22行,处理中 connection.client.runshell()
File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/db/backends/postgresql/client.py", 第66行,在runhell中 DatabaseClient.runshell_db(self.connection.get_connection_params())
File" /home/ubuntu/Env/ss2017/lib/python3.5/site-packages/django/db/backends/postgresql/client.py", 第58行,在runshell_db中 subprocess.check_call(args)
文件" /usr/lib/python3.5/subprocess.py",第581行,在check_call中 引发CalledProcessError(retcode,cmd)subprocess.CalledProcessError:Command' [' psql',' -U',' db_name', ' -h',' whatever.rds.amazonaws.com',' -p',' 5342',' user_name&# 39;]' 返回非零退出状态2
我尝试创建Django应用程序的新副本以查看是否涉及到损坏的文件,并且我对settings.py
文件进行了一些更改,但没有运气。
有什么想法吗?
修改:
Settings.py(重要位)
DEBUG = False
ALLOWED_HOSTS = ['localhost', '0.0.0.0', '127.0.0.1', 'compute.amazonaws.com']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'database_name',
'USER': 'xxxxxxxx',
'PASSWORD': 'xxxxxxxx',
'HOST': 'whatever.us-west-2.rds.amazonaws.com',
'PORT': '5342',
}
}
答案 0 :(得分:0)
我最终在EC2服务器上创建了一个本地postgres数据库,以查看是否出现任何错误。当我尝试运行makemigrations
或migrate
来设置数据库时,我得到了一个"关系不存在"错误。堆栈跟踪指向我的一个视图中的一行,看起来像这样:
some_queryset = Model.objects.all()
some_queryset.delete() # <--- this line was the problem
尽管从技术上讲这是删除给定表中所有条目的可接受方式,但Django(在服务器上)并不喜欢给定模型的关系不存在这一事实。
我对该行进行了注释,并且能够毫无问题地连接到数据库。
因此对于未来的读者 - 如果您的Django应用程序挂起runserver
,但您可以从EC2实例访问RDS数据库,请尝试设置本地数据库以检查是否存在任何问题。
答案 1 :(得分:0)
exit status 2
通常意味着您使用错误的参数调用了psql。对我来说,psql身份验证错误也触发了此退出代码。我的问题最终成为settings.DATABASES['default']
正在使用的DBPASSWORD环境变量中的拼写错误。