如何使用Django来访问表从一个不同的模式在Oracle 11g中?

问题描述 投票:0回答:3

我有一个在Oracle 11g中命名mi_abc用户。用户没有任何数据库中的表,但访问另一个模式sch_abc所有表。当我的SQLDeveloper从mi_abc的sch_abc模式运行正常选择查询,它工作完全正常,但是当我使用Django,我总是得到错误: -

django.db.utils.DatabaseError: ORA-00942: table or view does not exist

我试图设置db_table = sch_abc.tableName并设置db_table = TABLENAME但两者给我同样的错误。任何线索如何解决这个问题?

跟踪:-

Traceback (most recent call last):
  File "C:\xxx\xxx\xxx\xxx\xxx\xxx\xxxx\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\xxx\xxx\xxxx\xxxx\xxxx\Python\Python37\lib\site-packages\django\utils\deprecation.py", line 142, in __call__
    response = self.process_response(request, response)
  File "C:\xxxx\xxxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\contrib\sessions\middleware.py", line 58, in process_response
    request.session.save()
  File "C:\xxx\xxxx\xxxx\xxxx\xxxxx\Python\Python37\lib\site-packages\django\contrib\sessions\backends\db.py", line 81, in save
    return self.create()
  File "C:\xxxx\xxxxx\xxxx\xxxx\xxxxx\Python\Python37\lib\site-packages\django\contrib\sessions\backends\db.py", line 50, in create
    self._session_key = self._get_new_session_key()
  File "C:\xxxx\xxxxx\xxxxx\xxxxx\xxxx\Python\Python37\lib\site-packages\django\contrib\sessions\backends\base.py", line 164, in _get_new_session_key
    if not self.exists(session_key):
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\contrib\sessions\backends\db.py", line 46, in exists
    return self.model.objects.filter(session_key=session_key).exists()
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\models\query.py", line 673, in exists
    return self.query.has_results(using=self.db)
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\models\sql\query.py", line 517, in has_results
    return compiler.has_results()
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\models\sql\compiler.py", line 858, in has_results
    return bool(self.execute_sql(SINGLE))
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\models\sql\compiler.py", line 899, in execute_sql
    raise original_exception
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\models\sql\compiler.py", line 889, in execute_sql
    cursor.execute(sql, params)
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\backends\utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\utils\six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\backends\utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "C:\xxx\xxx\xxx\xxx\xxx\Python\Python37\lib\site-packages\django\db\backends\oracle\base.py", line 497, in execute
    return self.cursor.execute(query, self._param_generator(params))
django.db.utils.DatabaseError: ORA-00942: table or view does not exist
python django django-models oracle11g cx-oracle
3个回答
1
投票

好吧,我解决了这个问题,让我告诉你,有没有直接的方法来做到这一点在Django。我的应用程序的问题是,我使用的Django authetication功能,还会话处理。所有这些表是由Django的直接在初始迁移创建。因此,有在models.py文件,你可以简单地追加模式名,并要求您的应用程序连接到该架构的表中没有他们的存在。

我最后做的是,我创建的私有同义词,实际上包含在这些表中的其他架构的所有表。如果你这样做,你没有改变你的Django代码什么。您的应用程序将简单的工作,因为甲骨文会做的实际连接到正确的表肮脏的工作。你只会调用表在应用程序中,仿佛是你自己的。在当Django看起来像django_session中,AUTH_USER等表这种方式,它只是查询它像它总是和Oracle重定向到存在于另一个架构的实际表。

希望这有助于谁在未来面临这个问题的人。


0
投票

这绝不是正式支持,但这部作品在Postgres的:

class Meta:
    managed = False
    db_table = 'schema\".\"table'

花了Postgres的一些试验和错误,但你可能能为甲骨文类似的东西。这是因为Postgres的引擎报价对象名称,这假货的引用机制出来。

更新:

做一些挖后,我发现这对甲骨文(修改为Python 3):

class Meta:
    db_table = '"SCHEMA"."TABLE_NAME"'

来源:https://code.djangoproject.com/ticket/14136

我会建议保持managed = False除非你真的知道自己在做什么。祝好运!


0
投票

你可以设置所需要的模式,在执行命令之前。然后回到公众架构一旦查询集进行处理。

from django.db import connection
connection.set_schema(schema_name)
© www.soinside.com 2019 - 2024. All rights reserved.