python - jsonfield - django postgresql windows
¿Cómo usar esquemas en Django? (9)
Acabo de desarrollar un paquete para este problema: https://github.com/ryannjohnson/django-schemas .
Después de alguna configuración, simplemente puede llamar a set_db()
en sus modelos:
model_cls = UserModel.set_db(db=''db_alias'', schema=''schema_name'')
user_on_schema = model_cls.objects.get(pk=1)
El paquete utiliza las técnicas descritas en https://stackoverflow.com/a/1628855/5307109 y https://stackoverflow.com/a/18391525/5307109 , luego las envuelve para usarlas con los modelos de Django.
Me gustaría usar esquemas postgreSQL con django, ¿cómo puedo hacer esto?
Como se menciona en el siguiente ticket: https://code.djangoproject.com/ticket/6148 , podríamos establecer search_path
para el usuario django.
Una forma de lograr esto es establecer search_path
través del cliente psql
, como
ALTER USER my_user SET SEARCH_PATH TO path;
La otra forma es modificar la aplicación django, de modo que si reconstruimos la base de datos, django no escupirá todas las tablas en public
esquema public
.
Para lograr esto, puede anular el DatabaseWrapper
definido en django.db.backends.postgresql_psycopg2.base
Crea el siguiente directorio:
app/pg/ ├── __init__.py └── base.py
Aquí está el contenido de
base.py
from django.db.backends.postgresql_psycopg2.base import DatabaseWrapper class DatabaseWrapper(DatabaseWrapper): def __init__(self, *args, **kwargs): super(DatabaseWrapper, self).__init__(*args, **kwargs) def _cursor(self): cursor = super(DatabaseWrapper, self)._cursor() cursor.execute(''SET search_path = path'') return cursor
En
settings.py
, agregue la siguiente configuración de base de datos:DATABASES = { ''default'': { ''ENGINE'': ''app.pg'', ''NAME'': ''db'', ''USER'': ''user'', ''PASSWORD'': '''', ''HOST'': '''', ''PORT'': '''', } }
Es un poco más complicado que escapar con dificultad. Eche un vistazo al Boleto #6148 en Django para quizás una solución o al menos un parche. Hace algunos pequeños cambios en el núcleo de django.db, pero con suerte se incluirá oficialmente en django. Después de eso, solo es cuestión de decir
db_schema = ''whatever_schema''
en la clase Meta o para un conjunto de cambio global
DATABASE_SCHEMA = ''default_schema_name''
en settings.py
ACTUALIZACIÓN: 2015-01-08
El problema correspondiente en django ha estado abierto durante 7 años y el parche no funcionará más. La respuesta correcta a esto debería ser ...
Por el momento no puede usar esquemas postgreSQL en django de fábrica.
He estado usando:
db_table = ''"schema"."tablename"''
en el pasado sin darse cuenta de que solo funcionaba para operaciones de solo lectura. Cuando intente agregar un nuevo registro, fallaría porque la secuencia sería algo así como "schema.tablename" _column_id_seq.
db_table = ''schema/"./"tablename''
funciona hasta ahora. Gracias.
He tenido cierto éxito solo diciendo
db_table = ''schema/"./"tablename''
en la clase Meta, pero eso es realmente feo Y solo lo he usado en escenarios limitados; podría romperse si intentas algo complicado. Y como dije antes, en realidad no es compatible ...
No hay soporte explícito de Django para los esquemas postgreSQL.
Al usar Django (0.95), tuvimos que agregar un search_path al conector de la base de datos Django para PostgreSQL, porque Django no admitía especificar el esquema que usaban las tablas administradas por el ORM.
Tomado de:
http://nxsy.org/using-postgresql-schemas-with-sqlalchemy-and-elixir
La respuesta general es usar SQLAlchemy para construir el SQL correctamente.
Ah, y aquí hay otro enlace con algunas sugerencias sobre lo que puedes hacer con la base de Django, extendiéndola para tratar de apoyar tu esquema:
Para la base de datos del servidor SQL:
db_table = "[your_schema].[your_table]"
Sé que esta es una pregunta bastante antigua, pero una solución diferente es alterar SEARCH_PATH.
Ejemplo
Digamos que tienes tres tablas.
-
schema1.table_name_a
-
schema2.table_name_b
-
table_name_c
Puedes ejecutar el comando:
SET SEARCH_PATH to public,schema1,schema2;
Y consulte las tablas por sus nombres de tabla solo en django.
Tal vez esto ayude.
DATABASES = {
''default'': {
''ENGINE'': ''django.db.backends.postgresql_psycopg2'',
''OPTIONS'': {
''options'': ''-c search_path=your_schema''
},
''NAME'': ''your_name'',
''USER'': ''your_user'',
''PASSWORD'': ''your_password'',
''HOST'': ''127.0.0.1'',
''PORT'': ''5432'',
}
}
Obtengo la respuesta en el siguiente enlace: http://blog.amvtek.com/posts/2014/Jun/13/accessing-multiple-postgres-schemas-from-django/