【问题标题】:Getting 'DatabaseOperations' object has no attribute 'geo_db_type' error when doing a syncdb执行同步数据库时获取“DatabaseOperations”对象没有属性“geo_db_type”错误
【发布时间】:2012-09-14 08:20:09
【问题描述】:

我试图在 Heroku 上的 GeoDjango 应用上运行 heroku run python manage.py syncdb,但出现以下错误:

AttributeError: 'DatabaseOperations' 对象没有属性 'geo_db_type'

All of my research 产生了相同的解决方案:确保使用 django.contrib.gis.db.backends.postgis 作为数据库引擎。有趣的是,我已经在这样做了(我在INSTALLED_APPS 中也有django.contrib.gis):

settings.py

DATABASES = {
  'default': {
    'ENGINE': 'django.contrib.gis.db.backends.postgis',
    'NAME': '...',
    'HOST': '...',
    'PORT': ...,
    'USER': '...',
    'PASSWORD': '...'
  }
}

INSTALLED_APPS = (
    ...,
    'django.contrib.gis',
)

我还有什么遗漏的吗?非常感谢任何帮助,以下是完整的错误跟踪供参考:

Running `python manage.py syncdb` attached to terminal... up, run.1
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
  File "/app/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/app/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/app/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 91, in handle_noargs
    sql, references = connection.creation.sql_create_model(model, self.style, seen_models)
  File "/app/lib/python2.7/site-packages/django/db/backends/creation.py", line 44, in sql_create_model
    col_type = f.db_type(connection=self.connection)
  File "/app/lib/python2.7/site-packages/django/contrib/gis/db/models/fields.py", line 200, in db_type
    return connection.ops.geo_db_type(self)
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'

更新:我遵循GeoDjango tutorialHeroku/Django tutorial,构建了一个可以在我的开发机器上运行的简单应用程序。我使用custom GeoDjango buildpack 将它推送到 Heroku,并尝试了 syncdb,但得到了同样的错误。这是 Django/GeoDjango、Heroku 还是 buildpack 的问题?我的开发环境使用的是 PostgreSQL 9.1 和 PostGIS 2.0,但 Heroku 使用的是 9.0.9 和 1.5,这可能是问题吗?

【问题讨论】:

    标签: django heroku geodjango


    【解决方案1】:

    在可能的情况下我遇到了这个问题,因为我忘记在 settings.py 中进一步注释掉数据库设置:

    # Update database configuration with $DATABASE_URL.
    db_from_env = dj_database_url.config(conn_max_age=500)
    DATABASES['default'].update(db_from_env)
    

    这些行覆盖了我在上面添加的设置。添加这个以防其他人遇到同样的问题。

    【讨论】:

      【解决方案2】:

      我正在使用堆栈 cedar 14 上的 Python 示例应用程序和带有 PostGIS 的常规 Heroku buildpack Heroku/python 并且遇到了我的数据库设置被覆盖的相同问题使用错误的数据库引擎,导致heroku run python manage.py migrate 因上述错误而失败。 只是在设置中添加引擎不会改变任何东西。 经过一番调查,我发现是在我的 settings.py 的最后一行中对django_heroku.settings(locals()) 的调用正在恢复我的更改。

      我通过在之后添加一行再次覆盖引擎来修复它:

      django_heroku.settings(locals())
      DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
      

      【讨论】:

      • 这完全为我解决了这个问题。我觉得这应该作为 django_heroku 的问题提出,因为我认为这不是预期的功能。
      【解决方案3】:

      我在尝试使用这样设置的测试数据库运行测试时遇到此错误:

      if 'test' in sys.argv:
          DATABASES = {
              'default': {
                  'ENGINE': 'django.db.backends.sqlite3', 
                  'NAME': '_testdb',
              }
          }
      

      问题在于 sqlite3 DatabaseOperations 对象没有 geo_db_type 属性(如本文标题所示)。

      我的解决方案是将后端更改为与 sqlite 等效的 GIS 引擎:

              'ENGINE': 'django.contrib.gis.db.backends.spatialite'
      

      有关所有可能的后端,请参阅有关 GeoDjango 安装的 Django 文档,以及安装说明:https://docs.djangoproject.com/en/3.0/ref/contrib/gis/install/#spatial-database

      【讨论】:

      • 链接好像失效了。您能否发布一个新链接并将相关文本复制到您的答案中?谢谢!
      • 更新了链接。看起来 v1.9 已经死了一段时间了。
      【解决方案4】:

      Settings.py > INSTALLED_APPS

      INSTALLED_APPS = [
      .
      .
      'django.contrib.gis'
      .
      ]
      

      Settings.py > 数据库

      DATABASES = {
      'default': {
          'ENGINE': 'django.contrib.gis.db.backends.mysql',
           ...,
          }
      } 
      

      【讨论】:

        【解决方案5】:

        我将默认数据库引擎从 psycopg2 更改为 postgis

        以前

        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.postgresql_psycopg2',
                ...,
            }
        }
        

        现在

        DATABASES = {
            'default': {
                'ENGINE': 'django.contrib.gis.db.backends.postgis',
                ...,
            }
        }
        

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题,我不得不改变:

          'ENGINE': 'django.db.backends.postgresql_psycopg2',
          

          到:

          'ENGINE': 'django.contrib.gis.db.backends.postgis',
          

          【讨论】:

            【解决方案7】:

            OP 使用的是 GeoDjango buildpack,但如果有人像我一样使用 Geo buildpackdj_database_url 到达这里,请不要忘记在 settings.py 中的最后一行:

            import dj_database_url
            DATABASES['default'] = dj_database_url.config()
            DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
            

            更新

            dj_database_urldirectly supportsPostGIS。如果您可以将数据库 URL 更改为以 postgis 开头,则可以不使用上面代码中的最后一行。

            【讨论】:

            • 可以修复设置问题。在运行 Django 服务器时,它会导致问题。以下@Sillson 方法将解决问题。遇到问题:: Traceback (most recent call last): File "/Users/seenu/.venv/1729/lib/python3.7/site-packages/django/template/utils.py", line 66, in __getitem__ return self._engines[alias] KeyError: 'django'
            • 我想,节省了我很多时间,因为我不确定如何找到这个原因。但奇怪的是昨天似乎一切正常,今天我很惊讶地看到错误。 IDK,也许这是一个梦。谢谢!
            • 现在我收到此错误请帮助django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the NAME value.
            【解决方案8】:

            对我有帮助

            1) 将'django.contrib.gis', 添加到INSTALLED_APPS
            2) 从

            改变
            DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
            

            DATABASES = {
            'default': {
                'ENGINE': 'django.contrib.gis.db.backends.mysql', 
            

            【讨论】:

              【解决方案9】:

              这篇文章很旧,但我只是想分享我对这个问题的答案。我用的是dj数据库包,不知道用postgis的时候连接url不一样。 PostGIS 的连接字符串是postgis://USER:PASSWORD@HOST:PORT/NAME

              希望这对某人有所帮助。

              【讨论】:

              • 实际上,对 URL 的这一更改为我节省了一天!
              • 工作就像一个魅力!
              • 连接字符串是什么意思?我应该把它放在哪里?
              【解决方案10】:

              buildpack 是这里的罪魁祸首。我没有使用Heroku's buildpack page 上列出的 GeoDjango buildpack,而是使用了最近更新的one of it's forks

              另外,当我执行 git push heroku master 时,Heroku 会为应用程序创建一个开发数据库,​​当我执行同步数据库时,我的 DATABASES 设置被忽略,Heroku 会尝试使用开发数据库 相反......显然是一个问题,因为开发数据库没有/不能安装 PostGIS。所以我在使用git push(使用correct buildpack)创建开发数据库后销毁了它,然后运行了syncdb,它就可以工作了。

              【讨论】:

              • 我在使用自定义构建包后仍然收到此错误。
              • 虽然这个问题是 Heroku 特有的,但标题很笼统。如果 Django DATABASES ENGINE 未设置为 django.contrib.gis.db.backends.postgis,也会出现问题
              猜你喜欢
              • 2016-08-01
              • 2023-04-07
              • 1970-01-01
              • 2020-10-19
              • 2021-12-19
              • 2021-08-16
              • 2018-02-14
              • 2018-07-31
              • 1970-01-01
              相关资源
              最近更新 更多