django 应用程序的 Heroku 推送得到“没有名为 psycopg2.extensions 的模块”

Posted

技术标签:

【中文标题】django 应用程序的 Heroku 推送得到“没有名为 psycopg2.extensions 的模块”【英文标题】:Heroku push of django app gets "No module named psycopg2.extensions" 【发布时间】:2012-11-17 04:31:08 【问题描述】:

我正在尝试将一个 django 应用程序推送到 heroku,并收到一个我在 heroku 或 *** 论坛中没有看到的错误。我正在使用 postgres。

我不知道从哪里开始;我在任何文档中都看不到有什么问题。主要错误是:

ImportError:没有名为 psycopg2.extensions 的模块

...但是heroku的配置是把它设置为ENGINE,我不知道怎么弄。

我与 heroku 的对话以确保它了解 postgres

$ heroku addons:add heroku-postgresql:dev
Adding heroku-postgresql:dev on morning-crag-1585... done, v24 (free)
Attached as HEROKU_POSTGRESQL_OLIVE_URL
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pgbackups:restore.
.
Use `heroku addons:docs heroku-postgresql:dev` to view documentation.
$ heroku pg:wait 
$ heroku config | grep HEROKU_POSTGRESQL
HEROKU_POSTGRESQL_OLIVE_URL: postgres://<blah-blah-blah>@ec2-<ip-address>.compute-1.amazonaws.com:5432/<blah-blah>
$ heroku pg:promote HEROKU_POSTGRESQL_OLIVE_URL
Promoting HEROKU_POSTGRESQL_OLIVE_URL to DATABASE_URL... done

我的要求.txt:

Django==1.4.2
wsgiref==0.1.2
dj-database-url==0.2.1

我的 settings.py 中的一个 sn-p:

print "Got here before!\n"
try:
  import dj_database_url
  DATABASES =  'default': dj_database_url.config(default='postgres://localhost') 
except:
  print "Unexpected error:", sys.exc_info()

print DATABASES

当我推送到heroku时,我从heroku logs得到这个:

heroku[slugc]: Slug compilation finished
heroku[web.1]: Starting process with command `python ./manage.py runserver 0.0.0.0:30550 --noreload`
app[web.1]: Got here before!
app[web.1]: 
app[web.1]: 'default': 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': '<blah blah>', 'HOST': 'ec2-<iip-address>.compute-1.amazonaws.com', 'USER': '<blah blah>', 'PASSWORD': '<blah>', 'PORT': 5432
app[web.1]: 
app[web.1]: Validating models...
app[web.1]: Traceback (most recent call last):
app[web.1]:   File "./manage.py", line 10, in <module>
app[web.1]:     execute_from_command_line(sys.argv)
app[web.1]:     utility.execute()
app[web.1]:     self.execute(*args, **options.__dict__)
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
app[web.1]:     self.fetch_command(subcommand).run_from_argv(self.argv)
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
app[web.1]:     self.inner_run(*args, **options)
app[web.1]:     self.validate(display_num_errors=True)
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 91, in inner_run
app[web.1]:     num_errors = get_validation_errors(s, app)
app[web.1]:     self.run(*args, **options)
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/db/utils.py", line 92, in __getitem__
app[web.1]:     output = self.handle(*args, **options)
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/validation.py", line 23, in get_validation_errors
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
app[web.1]:     from django.db import models, connection
app[web.1]:     return import_module('.base', backend_name)
app[web.1]:     __import__(name)
app[web.1]: ImportError: No module named psycopg2.extensions
app[web.1]:     return getattr(connections[DEFAULT_DB_ALIAS], item)
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/creation.py", line 1, in <module>
app[web.1]:     backend = load_backend(db['ENGINE'])
app[web.1]:     import psycopg2.extensions
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/db/__init__.py", line 40, in <module>
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 69, in handle
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 80, in run
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/db/utils.py", line 24, in load_backend
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 266, in validate
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/db/__init__.py", line 34, in __getattr__
app[web.1]:     backend = load_backend(connection.settings_dict['ENGINE'])
app[web.1]:     from django.db.backends.postgresql_psycopg2.creation import DatabaseCreation
app[web.1]:   File "/app/.heroku/venv/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 13, in <module>
heroku[web.1]: Process exited with status 1
heroku[web.1]: State changed from starting to crashed

【问题讨论】:

【参考方案1】:

您需要将psycopg2 安装添加到您的requirements.txt 文件中。它是数据库适配器——python 与 PostgreSQL 的接口方式,你确实不需要安装,因为 heroku 需要。

只需将psycopg2==2.4.4 行添加到您的requirements.txt 文件中。

顺便说一句,数据库附加组件本身并不是必需的。 dj-database-url 会自动处理它。查看heroku docs 获取分步指南。

【讨论】:

天啊!谢谢!做到了,并仔细阅读了文档(我一遍又一遍地阅读它们,但不知何故错过了那一行) 应该应用最新版本才能正常工作:pypi.org/project/psycopg2我加了psycopg2==2.9.3终于搞定了【参考方案2】:

我遵循了公认的答案,但它一次又一次地给我同样的错误。所以我不得不改变我的 requirements.txt 文件。 发件人:psycopg2==2.7.7 收件人:psycopg2-binary

现在它工作得很好。有关更多详细信息,请访问文档:http://initd.org/psycopg/docs/install.html#binary-install-from-pypi

【讨论】:

【参考方案3】:

我有同样的问题。我正在使用烧瓶。在 requirements.txt 中输入 psycopg 或 psycopg 二进制文件没有帮助。我的解决方案是:

退出 python 并访问虚拟环境 pip install psycopg2-binary

一切都很完美。

【讨论】:

【参考方案4】:

我安装了 psycopg2-binary。

pip install psycopg2-binary

添加到 requirements.txt 文件中。

提交并推送代码,它工作了。

【讨论】:

以上是关于django 应用程序的 Heroku 推送得到“没有名为 psycopg2.extensions 的模块”的主要内容,如果未能解决你的问题,请参考以下文章

由于“构建流超时”,无法 git-push 到 heroku

Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db

由于静态文件收集原因,Heroku 拒绝推送

Heroku 上的 Django 静态文件

Heroku 不会在 Django 中迁移模型

Heroku 上的 Django。没有运行 Web 进程