我有一个在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
好吧,我解决了这个问题,让我告诉你,有没有直接的方法来做到这一点在Django。我的应用程序的问题是,我使用的Django authetication功能,还会话处理。所有这些表是由Django的直接在初始迁移创建。因此,有在models.py文件,你可以简单地追加模式名,并要求您的应用程序连接到该架构的表中没有他们的存在。
我最后做的是,我创建的私有同义词,实际上包含在这些表中的其他架构的所有表。如果你这样做,你没有改变你的Django代码什么。您的应用程序将简单的工作,因为甲骨文会做的实际连接到正确的表肮脏的工作。你只会调用表在应用程序中,仿佛是你自己的。在当Django看起来像django_session中,AUTH_USER等表这种方式,它只是查询它像它总是和Oracle重定向到存在于另一个架构的实际表。
希望这有助于谁在未来面临这个问题的人。
这绝不是正式支持,但这部作品在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
除非你真的知道自己在做什么。祝好运!
你可以设置所需要的模式,在执行命令之前。然后回到公众架构一旦查询集进行处理。
from django.db import connection
connection.set_schema(schema_name)