Pregunta

Me encuentro con un proyecto Django que maneja dos clases distintas mapeadas en un nombre de tabla similar:

class BarA(models.Model):
[...]
class Meta:
    db_table = 'bar' # doesn't specify any schema

class BarB(models.Model):
[...]
class Meta:
    db_table = u'foo"."bar'

El proyecto está utilizando una base de datos que contiene dos esquemas: public y foo.

La forma en que esta aplicación se plantilla e implementada hace que las cosas sean aún más confusas: en algunos servidores, Django se conecta a la base de datos con el usuario "John", no miembro de ningún rol, pero en otros servidores se conecta con el usuario "Eric", miembro de un foo role.

Dos preguntas aquí:

  1. Si meta clase de Django no menciona ningún esquema específico, ¿Cómo decide Postgres con qué tabla funcionará? ? Hasta ahora, parece que el usuario Eric siempre golpeará el foo.bar mesa, y nunca el public.bar Uno, independientemente de la clase llamada. Con el usuario "John", solo estoy usando BarA clase y golpea correctamente public.bar.
  2. Django no parece manejar esquemas; es esta solución Considerado como una buena práctica para ese tipo de caso (tenga en cuenta que no puedo cambiar el nombre de las tablas existentes).
¿Fue útil?

Solución

En Postgres search_path variable Establezca la prioridad para elegir el esquema para la tabla:

Search_path (cadena)
Esta variable especifica el orden en que se buscan esquemas cuando un objeto (tabla, tipo de datos, función, etc.) se hace referencia a un nombre simple sin esquema especificado. Cuando hay objetos de nombres idénticos en diferentes esquemas, se utiliza el que se encuentra primero en la ruta de búsqueda.
[...]
El valor efectivo actual de la ruta de búsqueda se puede examinar a través de la función SQL Current_Schemas.

Una forma rápida de hacerlo:

SELECT current_schemas(True);

Puede encontrar detalles sobre cómo administrar search_path En la Sección 5.7.3. de este artículo: http://www.postgresql.org/docs/current/static/ddl-schemas.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top