2014-07-18 45 views
0

我需要将旧的oracle数据库集成到django应用程序中。基本上我需要将一些表映射到django模型。将角色设置为django orm上的oracle数据库用户

连接工作正常,如下:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.oracle', 
     'NAME': 'orad03', 
     'USER': 'u_hrp', 
     'PASSWORD': 'myp4ssw0rd', 
     'HOST': 'myhost.com.br', 
     'PORT': '1521' 
    } 
} 

我在这里的问题是,应用程序表是主人ADM_HRP下,应用程序使用用户U_HRP(这在都没有权限)。 INSERT,DELETE,SELECT等的权限位于角色R_HRP上。

所以,在传统的ASP/VBScript中应用它设置进行连接之后的角色:

Sub Connect() 
    Set objConexao = Server.CreateObject("ADODB.Connection") 
    objConexao.Mode = 3 
    objConexao.CommandTimeout = 90 

    Dim strDSN 

    strDSN="DSN=orad03;Uid=u_hrp;Pwd=myp4ssw0rd;" 
    objConexao.Open strDSN 
    objConexao.execute "SET ROLE R_HRP IDENTIFIED BY " & chr(34) & "myp4ssw0rd" & chr(34) 
End Sub 

我需要做同样的事情在我的Django应用程序,管理向右运行SET ROLE语句打开连接后

回答

1

我不确定默认情况下是否有任何选项。但我认为你可以用Django信号(钩子)实现你的目标。

https://docs.djangoproject.com/en/dev/ref/signals/#connection-created

connection_created后到数据库的新连接成功信号被调用。它给你一个连接对象。所以你可以这样做:

from django.db.backends.signals import connection_created 

def set_role(**kwargs): 
    connection = kwargs.get("connection", None) 
    if connection: 
     cursor = connection.cursor() 
     cursor.execute("SET ROLE R_HRP IDENTIFIED BY %s", "myp4ssw0rd") 

connection_created.connect(set_role) 

我没有oracle数据库,也没有测试过,但它应该指向你正确的方向。

+0

这似乎是一个很好的方法。我会尽快进行测试 –